From fc7f9f76f5b9ba70fbeccf68da847690fb1171dc Mon Sep 17 00:00:00 2001 From: Vitaly Tomilov Date: Sat, 18 Feb 2017 19:26:25 +0000 Subject: [PATCH] removing inline sql. (#3529) * removing inline sql. * Update index.js trying to fix indentation. * Update index.js commenting out console output for errors. * Rename json-object-set-key.sql to json-object-set-keys.sql * Update index.js * Update add-unique.sql correcting sql. * Update add.sql correcting sql. * Update contains-all.sql correcting sql. * Update contains.sql correcting sql. * Update remove.sql correcting sql. * Update json-object-set-keys.sql fixing sql reserved words. --- .../Postgres/PostgresStorageAdapter.js | 92 ++----------------- .../Storage/Postgres/sql/array/add-unique.sql | 11 +++ .../Storage/Postgres/sql/array/add.sql | 11 +++ .../Postgres/sql/array/contains-all.sql | 11 +++ .../Storage/Postgres/sql/array/contains.sql | 11 +++ .../Storage/Postgres/sql/array/remove.sql | 11 +++ src/Adapters/Storage/Postgres/sql/index.js | 32 +++++++ .../sql/misc/json-object-set-keys.sql | 19 ++++ 8 files changed, 113 insertions(+), 85 deletions(-) create mode 100644 src/Adapters/Storage/Postgres/sql/array/add-unique.sql create mode 100644 src/Adapters/Storage/Postgres/sql/array/add.sql create mode 100644 src/Adapters/Storage/Postgres/sql/array/contains-all.sql create mode 100644 src/Adapters/Storage/Postgres/sql/array/contains.sql create mode 100644 src/Adapters/Storage/Postgres/sql/array/remove.sql create mode 100644 src/Adapters/Storage/Postgres/sql/index.js create mode 100644 src/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js index 3ea47053..d7865a50 100644 --- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js +++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js @@ -1,6 +1,7 @@ import { createClient } from './PostgresClient'; import Parse from 'parse/node'; import _ from 'lodash'; +import sql from './sql'; const PostgresRelationDoesNotExistError = '42P01'; const PostgresDuplicateRelationError = '42P07'; @@ -1171,22 +1172,22 @@ export class PostgresStorageAdapter { }); /* eslint-disable no-console */ promises = promises.concat([ - this._client.any(json_object_set_key).catch((err) => { + this._client.none(sql.misc.jsonObjectSetKeys).catch((err) => { console.error(err); }), - this._client.any(array_add).catch((err) => { + this._client.none(sql.array.add).catch((err) => { console.error(err); }), - this._client.any(array_add_unique).catch((err) => { + this._client.none(sql.array.addUnique).catch((err) => { console.error(err); }), - this._client.any(array_remove).catch((err) => { + this._client.none(sql.array.remove).catch((err) => { console.error(err); }), - this._client.any(array_contains_all).catch((err) => { + this._client.none(sql.array.containsAll).catch((err) => { console.error(err); }), - this._client.any(array_contains).catch((err) => { + this._client.none(sql.array.contains).catch((err) => { console.error(err); }) ]); @@ -1270,84 +1271,5 @@ function literalizeRegexPart(s) { ); } -// Function to set a key on a nested JSON document -const json_object_set_key = 'CREATE OR REPLACE FUNCTION "json_object_set_key"(\ - "json" jsonb,\ - "key_to_set" TEXT,\ - "value_to_set" anyelement\ -)\ - RETURNS jsonb \ - LANGUAGE sql \ - IMMUTABLE \ - STRICT \ -AS $function$\ -SELECT concat(\'{\', string_agg(to_json("key") || \':\' || "value", \',\'), \'}\')::jsonb\ - FROM (SELECT *\ - FROM jsonb_each("json")\ - WHERE "key" <> "key_to_set"\ - UNION ALL\ - SELECT "key_to_set", to_json("value_to_set")::jsonb) AS "fields"\ -$function$;' - -const array_add = `CREATE OR REPLACE FUNCTION "array_add"( - "array" jsonb, - "values" jsonb -) - RETURNS jsonb - LANGUAGE sql - IMMUTABLE - STRICT -AS $function$ - SELECT array_to_json(ARRAY(SELECT unnest(ARRAY(SELECT DISTINCT jsonb_array_elements("array")) || ARRAY(SELECT jsonb_array_elements("values")))))::jsonb; -$function$;`; - -const array_add_unique = `CREATE OR REPLACE FUNCTION "array_add_unique"( - "array" jsonb, - "values" jsonb -) - RETURNS jsonb - LANGUAGE sql - IMMUTABLE - STRICT -AS $function$ - SELECT array_to_json(ARRAY(SELECT DISTINCT unnest(ARRAY(SELECT DISTINCT jsonb_array_elements("array")) || ARRAY(SELECT DISTINCT jsonb_array_elements("values")))))::jsonb; -$function$;`; - -const array_remove = `CREATE OR REPLACE FUNCTION "array_remove"( - "array" jsonb, - "values" jsonb -) - RETURNS jsonb - LANGUAGE sql - IMMUTABLE - STRICT -AS $function$ - SELECT array_to_json(ARRAY(SELECT * FROM jsonb_array_elements("array") as elt WHERE elt NOT IN (SELECT * FROM (SELECT jsonb_array_elements("values")) AS sub)))::jsonb; -$function$;`; - -const array_contains_all = `CREATE OR REPLACE FUNCTION "array_contains_all"( - "array" jsonb, - "values" jsonb -) - RETURNS boolean - LANGUAGE sql - IMMUTABLE - STRICT -AS $function$ - SELECT RES.CNT = jsonb_array_length("values") FROM (SELECT COUNT(*) as CNT FROM jsonb_array_elements("array") as elt WHERE elt IN (SELECT jsonb_array_elements("values"))) as RES ; -$function$;`; - -const array_contains = `CREATE OR REPLACE FUNCTION "array_contains"( - "array" jsonb, - "values" jsonb -) - RETURNS boolean - LANGUAGE sql - IMMUTABLE - STRICT -AS $function$ - SELECT RES.CNT >= 1 FROM (SELECT COUNT(*) as CNT FROM jsonb_array_elements("array") as elt WHERE elt IN (SELECT jsonb_array_elements("values"))) as RES ; -$function$;`; - export default PostgresStorageAdapter; module.exports = PostgresStorageAdapter; // Required for tests diff --git a/src/Adapters/Storage/Postgres/sql/array/add-unique.sql b/src/Adapters/Storage/Postgres/sql/array/add-unique.sql new file mode 100644 index 00000000..aad90d45 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/array/add-unique.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION array_add_unique( + "array" jsonb, + "values" jsonb +) + RETURNS jsonb + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ + SELECT array_to_json(ARRAY(SELECT DISTINCT unnest(ARRAY(SELECT DISTINCT jsonb_array_elements("array")) || ARRAY(SELECT DISTINCT jsonb_array_elements("values")))))::jsonb; +$function$; diff --git a/src/Adapters/Storage/Postgres/sql/array/add.sql b/src/Adapters/Storage/Postgres/sql/array/add.sql new file mode 100644 index 00000000..a0b58599 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/array/add.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION array_add( + "array" jsonb, + "values" jsonb +) + RETURNS jsonb + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ + SELECT array_to_json(ARRAY(SELECT unnest(ARRAY(SELECT DISTINCT jsonb_array_elements("array")) || ARRAY(SELECT jsonb_array_elements("values")))))::jsonb; +$function$; diff --git a/src/Adapters/Storage/Postgres/sql/array/contains-all.sql b/src/Adapters/Storage/Postgres/sql/array/contains-all.sql new file mode 100644 index 00000000..24355bc7 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/array/contains-all.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION array_contains_all( + "array" jsonb, + "values" jsonb +) + RETURNS boolean + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ + SELECT RES.CNT = jsonb_array_length("values") FROM (SELECT COUNT(*) as CNT FROM jsonb_array_elements("array") as elt WHERE elt IN (SELECT jsonb_array_elements("values"))) as RES; +$function$; diff --git a/src/Adapters/Storage/Postgres/sql/array/contains.sql b/src/Adapters/Storage/Postgres/sql/array/contains.sql new file mode 100644 index 00000000..f7c45878 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/array/contains.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION array_contains( + "array" jsonb, + "values" jsonb +) + RETURNS boolean + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ + SELECT RES.CNT >= 1 FROM (SELECT COUNT(*) as CNT FROM jsonb_array_elements("array") as elt WHERE elt IN (SELECT jsonb_array_elements("values"))) as RES; +$function$; diff --git a/src/Adapters/Storage/Postgres/sql/array/remove.sql b/src/Adapters/Storage/Postgres/sql/array/remove.sql new file mode 100644 index 00000000..52895d2f --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/array/remove.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION array_remove( + "array" jsonb, + "values" jsonb +) + RETURNS jsonb + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ + SELECT array_to_json(ARRAY(SELECT * FROM jsonb_array_elements("array") as elt WHERE elt NOT IN (SELECT * FROM (SELECT jsonb_array_elements("values")) AS sub)))::jsonb; +$function$; diff --git a/src/Adapters/Storage/Postgres/sql/index.js b/src/Adapters/Storage/Postgres/sql/index.js new file mode 100644 index 00000000..5ddfb036 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/index.js @@ -0,0 +1,32 @@ +'use strict'; + +var QueryFile = require('pg-promise').QueryFile; +var path = require('path'); + +module.exports = { + array: { + add: sql('array/add.sql'), + addUnique: sql('array/add-unique.sql'), + contains: sql('array/contains.sql'), + containsAll: sql('array/contains-all.sql'), + remove: sql('array/remove.sql') + }, + misc: { + jsonObjectSetKeys: sql('misc/json-object-set-keys.sql') + } +}; + +/////////////////////////////////////////////// +// Helper for linking to external query files; +function sql(file) { + + var fullPath = path.join(__dirname, file); // generating full path; + + var qf = new QueryFile(fullPath, {minify: true}); + + if (qf.error) { + throw qf.error; + } + + return qf; +} diff --git a/src/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql b/src/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql new file mode 100644 index 00000000..eb28b369 --- /dev/null +++ b/src/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql @@ -0,0 +1,19 @@ +-- Function to set a key on a nested JSON document + +CREATE OR REPLACE FUNCTION json_object_set_key( + "json" jsonb, + key_to_set TEXT, + value_to_set anyelement +) + RETURNS jsonb + LANGUAGE sql + IMMUTABLE + STRICT +AS $function$ +SELECT concat('{', string_agg(to_json("key") || ':' || "value", ','), '}')::jsonb + FROM (SELECT * + FROM jsonb_each("json") + WHERE key <> key_to_set + UNION ALL + SELECT key_to_set, to_json("value_to_set")::jsonb) AS fields +$function$;