extracted objects
This commit is contained in:
171
docs/packages/PLJSON_OBJECT_CACHE.md
Normal file
171
docs/packages/PLJSON_OBJECT_CACHE.md
Normal file
@@ -0,0 +1,171 @@
|
||||
# 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;```
|
||||
Reference in New Issue
Block a user