diff --git a/ideas/sql_from_srce_definition.sql b/ideas/sql_from_srce_definition.sql new file mode 100644 index 0000000..cfe8cd3 --- /dev/null +++ b/ideas/sql_from_srce_definition.sql @@ -0,0 +1,52 @@ +WITH s AS ( +select +$${ + "name":"DMAPI", + "source":"client_file", + "loading_function":"csv", + "constraint":[ + "{doc}" + ], + "schema_type":"JSONB_POPULATE", + "table_schema":[ + { + "path":"{doc,origin_addresses,0}", + "type":"text", + "column_name":"origin_address" + }, + { + "path":"{doc,destination_addresses,0}", + "type":"text", + "column_name":"origin_address" + }, + { + "path":"{doc,status}", + "type":"text", + "column_name":"status" + }, + { + "path":"{doc,rows,0,elements,0,distance,value}", + "type":"numeric", + "column_name":"distance" + }, + { + "path":"{doc,rows,0,elements,0,duration,value}", + "type":"numeric", + "column_name":"duration" + } + ] +}$$::jsonb->'table_schema' defn +) +,ext AS ( +SELECT + ae.v->>'path' path + ,ae.v->>'type' dtype + ,ae.v->>'column_name' column_name +FROM + s + LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(s.defn) ae(v) ON TRUE +) +SELECT + 'SELECT '||string_agg('(rec#>>('''||path||'''::text[]))::'||dtype||' AS '||column_name,', ')||' FROM tps.trans WHERE srce = ''DMAPI''' +FROM + ext \ No newline at end of file diff --git a/perf_test/parse_jsonb_with_path.sql b/perf_test/parse_jsonb_with_path.sql new file mode 100644 index 0000000..31c26c8 --- /dev/null +++ b/perf_test/parse_jsonb_with_path.sql @@ -0,0 +1,44 @@ +create temp table x as ( +select + t.rec +from + generate_series(1,1000000,1) s + inner join tps.trans t on + srce = 'DMAPI' +) with data; + + +create temp table x2 as ( +select + ( + rec #>>( + '{doc,origin_addresses,0}'::text[] + ) + )::text as origin_address, + ( + rec #>>( + '{doc,destination_addresses,0}'::text[] + ) + )::text as desatination_address, + ( + rec #>>( + '{doc,status}'::text[] + ) + )::text as status, + ( + rec #>>( + '{doc,rows,0,elements,0,distance,value}'::text[] + ) + )::numeric as distance, + ( + rec #>>( + '{doc,rows,0,elements,0,duration,value}'::text[] + ) + )::numeric as duration +from + x +) with data; + + +drop table x; +drop table x2; \ No newline at end of file