172 lines
4.2 KiB
Markdown
172 lines
4.2 KiB
Markdown
# PLJSON_OBJECT_CACHE
|
|
|
|
## Package Specification
|
|
|
|
```sql
|
|
package pljson_object_cache as
|
|
|
|
/* E.I.Sarmas (github.com/dsnz) 2020-04-18 object cache to speed up internal operations */
|
|
|
|
/* !!! NOTE: this package is used internally by pljson and it's not part of the api !!! */
|
|
|
|
/* index by string of "id.path" or "path" */
|
|
type pljson_element_tab is table of pljson_element index by varchar2(250);
|
|
|
|
last_id number := 0;
|
|
pljson_element_cache pljson_element_tab;
|
|
cache_reqs number := 0;
|
|
cache_hits number := 0;
|
|
cache_invalid_reqs number := 0;
|
|
|
|
type vset is table of varchar2(1) index by varchar2(250);
|
|
names_set vset;
|
|
|
|
procedure set_names_set(names pljson_varray);
|
|
function in_names_set(a_name varchar2) return boolean;
|
|
|
|
procedure reset;
|
|
procedure flush;
|
|
procedure print_stats;
|
|
function next_id return number;
|
|
function object_key(elem pljson_element, piece varchar2) return varchar2;
|
|
function get(key varchar2) return pljson_element;
|
|
procedure set(key varchar2, val pljson_element);
|
|
end;```
|
|
|
|
## Package Body
|
|
|
|
```sql
|
|
package body pljson_object_cache as
|
|
|
|
/* E.I.Sarmas (github.com/dsnz) 2020-04-18 object cache to speed up internal operations */
|
|
|
|
/* !!! NOTE: this package is used internally by pljson and it's not part of the api !!! */
|
|
|
|
procedure set_names_set(names pljson_varray) is
|
|
begin
|
|
if names.COUNT = 0 then
|
|
return;
|
|
end if;
|
|
for i in names.FIRST .. names.LAST loop
|
|
names_set(names(i)) := '1';
|
|
end loop;
|
|
end;
|
|
|
|
function in_names_set(a_name varchar2) return boolean is
|
|
begin
|
|
if names_set.exists(a_name) then
|
|
return true;
|
|
else
|
|
return false;
|
|
end if;
|
|
end;
|
|
|
|
procedure reset is
|
|
begin
|
|
last_id := 0;
|
|
flush;
|
|
end;
|
|
|
|
procedure flush is
|
|
begin
|
|
pljson_element_cache.delete;
|
|
cache_reqs := 0;
|
|
cache_hits := 0;
|
|
cache_invalid_reqs := 0;
|
|
end;
|
|
|
|
procedure print_stats is
|
|
begin
|
|
dbms_output.put_line('reqs = ' || cache_reqs);
|
|
dbms_output.put_line('hits = ' || cache_hits);
|
|
dbms_output.put_line('invalid reqs = ' || cache_invalid_reqs);
|
|
dbms_output.put_line('cache count = ' || pljson_element_cache.count);
|
|
dbms_output.put_line('id count = ' || last_id);
|
|
end;
|
|
|
|
function next_id return number is
|
|
begin
|
|
last_id := last_id + 1;
|
|
return last_id;
|
|
end;
|
|
|
|
function object_key(elem pljson_element, piece varchar2) return varchar2 is
|
|
key varchar2(250);
|
|
begin
|
|
if elem.object_id is null or elem.object_id = 0 then
|
|
cache_invalid_reqs := cache_invalid_reqs + 1;
|
|
return null;
|
|
end if;
|
|
key := to_char(elem.object_id)||'.'||piece;
|
|
return key;
|
|
end;
|
|
|
|
function get(key varchar2) return pljson_element is
|
|
cache_key varchar2(32767);
|
|
begin
|
|
cache_key := key;
|
|
if cache_key is null then
|
|
cache_key := '$';
|
|
end if;
|
|
cache_reqs := cache_reqs + 1;
|
|
if pljson_element_cache.exists(cache_key) then
|
|
cache_hits := cache_hits + 1;
|
|
return pljson_element_cache(cache_key);
|
|
else
|
|
return null;
|
|
end if;
|
|
end;
|
|
|
|
procedure set(key varchar2, val pljson_element) is
|
|
cache_key varchar2(32767);
|
|
begin
|
|
cache_key := key;
|
|
if cache_key is null then
|
|
cache_key := '$';
|
|
end if;
|
|
--dbms_output.put_line('caching: ' || cache_key);
|
|
pljson_element_cache(cache_key) := val;
|
|
end;
|
|
|
|
/*
|
|
-- experimental, ignore
|
|
-- to use with 'get_json_element'
|
|
|
|
function get_piece(elem pljson, piece varchar2) return pljson_element is
|
|
key varchar2(250);
|
|
val pljson_element;
|
|
begin
|
|
key := object_cache.object_key(elem, piece);
|
|
if key is null then
|
|
return elem.get(piece);
|
|
end if;
|
|
val := object_cache.get(key);
|
|
if val is not null then
|
|
return val;
|
|
else
|
|
val := elem.get(piece);
|
|
object_cache.set(key, val);
|
|
return val;
|
|
end if;
|
|
end;
|
|
|
|
function get_piece(elem pljson_list, piece varchar2) return pljson_element is
|
|
key varchar2(250);
|
|
val pljson_element;
|
|
begin
|
|
key := object_cache.object_key(elem, piece);
|
|
if key is null then
|
|
return elem.get(piece);
|
|
end if;
|
|
val := object_cache.get(key);
|
|
if val is not null then
|
|
return val;
|
|
else
|
|
val := elem.get(piece);
|
|
object_cache.set(key, val);
|
|
return val;
|
|
end if;
|
|
end;
|
|
*/
|
|
end;```
|