@snowtop/ent 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,6 +29,7 @@ const action_1 = require("../action");
29
29
  const schema_1 = require("../schema/schema");
30
30
  const global_schema_1 = require("../core/global_schema");
31
31
  const ent_1 = require("../core/ent");
32
+ const query_impl_1 = require("../core/query_impl");
32
33
  class DeleteNodeOperation {
33
34
  constructor(id, builder, options) {
34
35
  this.id = id;
@@ -203,7 +204,7 @@ class EditNodeOperation {
203
204
  cls = clause.And(cls, optionClause);
204
205
  }
205
206
  }
206
- const query = (0, ent_1.buildQuery)({
207
+ const query = (0, query_impl_1.buildQuery)({
207
208
  fields: opts.fields.length ? opts.fields : ["*"],
208
209
  tableName: options.tableName,
209
210
  clause: cls,
package/core/clause.d.ts CHANGED
@@ -116,6 +116,8 @@ export declare function JSONObjectFieldKeyAsText<T extends Data, K = keyof T>(co
116
116
  type predicate = "==" | ">" | "<" | "!=" | ">=" | "<=";
117
117
  export declare function JSONPathValuePredicate<T extends Data, K = keyof T>(dbCol: K, path: string, val: any, pred: predicate): Clause<T, K>;
118
118
  export declare function JSONKeyExists<T extends Data, K = keyof T>(dbCol: K, val: any): Clause<T, K>;
119
+ export declare function JSONBKeyInList<T extends Data, K = keyof T>(dbCol: K, jsonCol: string, val: any): Clause<T, K>;
120
+ export declare function JSONKeyInList<T extends Data, K = keyof T>(dbCol: K, jsonCol: string, val: any): Clause<T, K>;
119
121
  export declare function PaginationMultipleColsSubQuery<T extends Data, K = keyof T>(col: K, op: string, tableName: string, uniqueCol: K, val: any): Clause<T, K>;
120
122
  export declare function Add<T extends Data, K = keyof T>(col: K, value: any): Clause<T, K>;
121
123
  export declare function Subtract<T extends Data, K = keyof T>(col: K, value: any): Clause<T, K>;
package/core/clause.js CHANGED
@@ -23,8 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.getCombinedClause = exports.Modulo = exports.Divide = exports.Multiply = exports.Subtract = exports.Add = exports.PaginationMultipleColsSubQuery = exports.JSONKeyExists = exports.JSONPathValuePredicate = exports.JSONObjectFieldKeyAsText = exports.JSONObjectFieldKeyASJSON = exports.sensitiveValue = exports.TsVectorWebsearchToTsQuery = exports.TsVectorPhraseToTsQuery = exports.TsVectorPlainToTsQuery = exports.TsVectorColTsQuery = exports.WebsearchToTsQuery = exports.PhraseToTsQuery = exports.PlainToTsQuery = exports.TsQuery = exports.DBTypeNotIn = exports.TextNotIn = exports.IntegerNotIn = exports.UuidNotIn = exports.DBTypeIn = exports.TextIn = exports.IntegerIn = exports.UuidIn = exports.In = exports.OrOptional = exports.Or = exports.AndOptional = exports.And = exports.LessEq = exports.GreaterEq = exports.Less = exports.Greater = exports.NotEq = exports.Eq = exports.ArrayNotEq = exports.ArrayEq = exports.PostgresArrayNotOverlaps = exports.PostgresArrayOverlaps = exports.PostgresArrayNotContains = exports.PostgresArrayNotContainsValue = exports.PostgresArrayContains = exports.PostgresArrayContainsValue = exports.notInClause = exports.inClause = void 0;
26
+ exports.Modulo = exports.Divide = exports.Multiply = exports.Subtract = exports.Add = exports.PaginationMultipleColsSubQuery = exports.JSONKeyInList = exports.JSONBKeyInList = exports.JSONKeyExists = exports.JSONPathValuePredicate = exports.JSONObjectFieldKeyAsText = exports.JSONObjectFieldKeyASJSON = exports.sensitiveValue = exports.TsVectorWebsearchToTsQuery = exports.TsVectorPhraseToTsQuery = exports.TsVectorPlainToTsQuery = exports.TsVectorColTsQuery = exports.WebsearchToTsQuery = exports.PhraseToTsQuery = exports.PlainToTsQuery = exports.TsQuery = exports.DBTypeNotIn = exports.TextNotIn = exports.IntegerNotIn = exports.UuidNotIn = exports.DBTypeIn = exports.TextIn = exports.IntegerIn = exports.UuidIn = exports.In = exports.OrOptional = exports.Or = exports.AndOptional = exports.And = exports.LessEq = exports.GreaterEq = exports.Less = exports.Greater = exports.NotEq = exports.Eq = exports.ArrayNotEq = exports.ArrayEq = exports.PostgresArrayNotOverlaps = exports.PostgresArrayOverlaps = exports.PostgresArrayNotContains = exports.PostgresArrayNotContainsValue = exports.PostgresArrayContains = exports.PostgresArrayContainsValue = exports.notInClause = exports.inClause = void 0;
27
+ exports.getCombinedClause = void 0;
27
28
  const db_1 = __importStar(require("./db"));
29
+ const query_impl_1 = require("./query_impl");
28
30
  function isSensitive(val) {
29
31
  return (val !== null &&
30
32
  typeof val === "object" &&
@@ -90,6 +92,28 @@ class simpleClause {
90
92
  return `${this.col}${this.op}${rawValue(this.value)}`;
91
93
  }
92
94
  }
95
+ class queryClause {
96
+ constructor(dependentQueryOptions) {
97
+ this.dependentQueryOptions = dependentQueryOptions;
98
+ }
99
+ clause(idx) {
100
+ const q = (0, query_impl_1.buildQuery)(this.dependentQueryOptions);
101
+ return `EXISTS (${q})`;
102
+ }
103
+ columns() {
104
+ // @ts-ignore
105
+ return this.dependentQueryOptions.clause.columns();
106
+ }
107
+ values() {
108
+ return this.dependentQueryOptions.clause.values();
109
+ }
110
+ logValues() {
111
+ return this.dependentQueryOptions.clause.logValues();
112
+ }
113
+ instanceKey() {
114
+ return `exists:${this.dependentQueryOptions.tableName}:${this.dependentQueryOptions.clause.instanceKey()}`;
115
+ }
116
+ }
93
117
  class isNullClause {
94
118
  constructor(col) {
95
119
  this.col = col;
@@ -729,6 +753,30 @@ function JSONKeyExists(dbCol, val) {
729
753
  return new simpleClause(dbCol, val, "?", new isNullClause(dbCol));
730
754
  }
731
755
  exports.JSONKeyExists = JSONKeyExists;
756
+ function JSONBKeyInList(dbCol, jsonCol, val) {
757
+ const opts = {
758
+ fields: ["1"],
759
+ tableName: `jsonb_array_elements(${dbCol}) AS json_element`,
760
+ // @ts-ignore
761
+ clause: And(JSONKeyExists("json_element", jsonCol),
762
+ // @ts-ignore
763
+ Eq(JSONObjectFieldKeyAsText("json_element", jsonCol), val)),
764
+ };
765
+ return new queryClause(opts);
766
+ }
767
+ exports.JSONBKeyInList = JSONBKeyInList;
768
+ function JSONKeyInList(dbCol, jsonCol, val) {
769
+ const opts = {
770
+ fields: ["1"],
771
+ tableName: `json_array_elements(${dbCol}) AS json_element`,
772
+ // @ts-ignore
773
+ clause: And(JSONKeyExists("json_element", jsonCol),
774
+ // @ts-ignore
775
+ Eq(JSONObjectFieldKeyAsText("json_element", jsonCol), val)),
776
+ };
777
+ return new queryClause(opts);
778
+ }
779
+ exports.JSONKeyInList = JSONKeyInList;
732
780
  // TODO need a better name for this lol
733
781
  // this assumes we're doing the same direction twice which isn't necessarily accurate in the future...
734
782
  class paginationMultipleColumnsSubQueryClause {
package/core/config.d.ts CHANGED
@@ -45,6 +45,7 @@ interface CodegenConfig {
45
45
  customAssocEdgePath?: importedObject;
46
46
  globalImportPath?: string;
47
47
  userOveriddenFiles?: string[];
48
+ transformDeleteMethod?: string;
48
49
  }
49
50
  interface PrettierConfig {
50
51
  custom?: boolean;
package/core/ent.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Queryer, SyncQueryer } from "./db";
2
- import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, QueryableDataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, CreateRowOptions, QueryDataOptions, SelectCustomDataOptions, LoaderWithLoadMany } from "./base";
2
+ import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, CreateRowOptions, QueryDataOptions, SelectCustomDataOptions, LoaderWithLoadMany } from "./base";
3
3
  import * as clause from "./clause";
4
4
  import DataLoader from "dataloader";
5
5
  import { OrderBy } from "./query_impl";
@@ -99,7 +99,6 @@ export declare function loadRow(options: LoadRowOptions): Promise<Data | null>;
99
99
  export declare function ___setLogQueryErrorWithError(val: boolean | undefined): void;
100
100
  export declare function performRawQuery(query: string, values: any[], logValues?: any[]): Promise<Data[]>;
101
101
  export declare function loadRows(options: LoadRowsOptions): Promise<Data[]>;
102
- export declare function buildQuery(options: QueryableDataOptions): string;
103
102
  interface GroupQueryOptions<T extends Data, K = keyof T> {
104
103
  tableName: string;
105
104
  clause?: clause.Clause<T, K>;
package/core/ent.js CHANGED
@@ -26,8 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.applyPrivacyPolicyForRow = exports.loadNodesByEdge = exports.loadEdgeForID2 = exports.loadRawEdgeCountX = exports.loadUniqueNode = exports.loadUniqueEdge = exports.loadCustomEdges = exports.getEdgeClauseAndFields = exports.loadEdges = exports.getDefaultLimit = exports.setDefaultLimit = exports.loadEdgeDatas = exports.loadEdgeData = exports.assocEdgeLoader = exports.AssocEdgeData = exports.getCursor = exports.AssocEdge = exports.deleteRowsSync = exports.deleteRows = exports.editRowSync = exports.editRow = exports.buildUpdateQuery = exports.createRowSync = exports.createRow = exports.buildInsertQuery = exports.buildGroupQuery = exports.buildQuery = exports.loadRows = exports.performRawQuery = exports.___setLogQueryErrorWithError = exports.loadRow = exports.loadRowX = exports.logQuery = exports.loadDerivedEntX = exports.loadDerivedEnt = exports.loadCustomCount = exports.loadCustomData = exports.loadCustomEnts = exports.loadEntsFromClause = exports.loadEntsList = exports.loadEnts = exports.loadEntXFromClause = exports.loadEntFromClause = exports.loadEntXViaKey = exports.loadEntX = exports.loadEntViaKey = exports.loadEnt = exports.getEntKey = exports.getEntLoader = exports.rowIsError = void 0;
30
- exports.getEdgeTypeInGroup = exports.applyPrivacyPolicyForRows = void 0;
29
+ exports.applyPrivacyPolicyForRows = exports.applyPrivacyPolicyForRow = exports.loadNodesByEdge = exports.loadEdgeForID2 = exports.loadRawEdgeCountX = exports.loadUniqueNode = exports.loadUniqueEdge = exports.loadCustomEdges = exports.getEdgeClauseAndFields = exports.loadEdges = exports.getDefaultLimit = exports.setDefaultLimit = exports.loadEdgeDatas = exports.loadEdgeData = exports.assocEdgeLoader = exports.AssocEdgeData = exports.getCursor = exports.AssocEdge = exports.deleteRowsSync = exports.deleteRows = exports.editRowSync = exports.editRow = exports.buildUpdateQuery = exports.createRowSync = exports.createRow = exports.buildInsertQuery = exports.buildGroupQuery = exports.loadRows = exports.performRawQuery = exports.___setLogQueryErrorWithError = exports.loadRow = exports.loadRowX = exports.logQuery = exports.loadDerivedEntX = exports.loadDerivedEnt = exports.loadCustomCount = exports.loadCustomData = exports.loadCustomEnts = exports.loadEntsFromClause = exports.loadEntsList = exports.loadEnts = exports.loadEntXFromClause = exports.loadEntFromClause = exports.loadEntXViaKey = exports.loadEntX = exports.loadEntViaKey = exports.loadEnt = exports.getEntKey = exports.getEntLoader = exports.rowIsError = void 0;
30
+ exports.getEdgeTypeInGroup = void 0;
31
31
  const db_1 = __importStar(require("./db"));
32
32
  const privacy_1 = require("./privacy");
33
33
  const clause = __importStar(require("./clause"));
@@ -558,7 +558,7 @@ async function loadRow(options) {
558
558
  return row;
559
559
  }
560
560
  }
561
- const query = buildQuery(options);
561
+ const query = (0, query_impl_1.buildQuery)(options);
562
562
  logQuery(query, options.clause.logValues());
563
563
  const pool = db_1.default.getInstance().getPool();
564
564
  const res = await pool.query(query, options.clause.values());
@@ -606,7 +606,7 @@ async function loadRows(options) {
606
606
  return rows;
607
607
  }
608
608
  }
609
- const query = buildQuery(options);
609
+ const query = (0, query_impl_1.buildQuery)(options);
610
610
  const r = await performRawQuery(query, options.clause.values(), options.clause.logValues());
611
611
  if (cache) {
612
612
  // put the rows in the cache...
@@ -615,25 +615,6 @@ async function loadRows(options) {
615
615
  return r;
616
616
  }
617
617
  exports.loadRows = loadRows;
618
- // private to ent
619
- function buildQuery(options) {
620
- const fields = options.fields.join(", ");
621
- // always start at 1
622
- const whereClause = options.clause.clause(1);
623
- const parts = [];
624
- parts.push(`SELECT ${fields} FROM ${options.tableName} WHERE ${whereClause}`);
625
- if (options.groupby) {
626
- parts.push(`GROUP BY ${options.groupby}`);
627
- }
628
- if (options.orderby) {
629
- parts.push(`ORDER BY ${(0, query_impl_1.getOrderByPhrase)(options.orderby)}`);
630
- }
631
- if (options.limit) {
632
- parts.push(`LIMIT ${options.limit}`);
633
- }
634
- return parts.join(" ");
635
- }
636
- exports.buildQuery = buildQuery;
637
618
  // this is used for queries when we select multiple ids at once
638
619
  function buildGroupQuery(options) {
639
620
  const fields = [...options.fields, "row_number()"];
package/core/logger.js CHANGED
@@ -28,6 +28,7 @@ function log(level, msg) {
28
28
  console.error(msg.message);
29
29
  return;
30
30
  }
31
+ // console[m[level]](inspect(msg, false, 10));
31
32
  console[m[level]](msg);
32
33
  }
33
34
  }
@@ -1,3 +1,4 @@
1
+ import { QueryableDataOptions } from "./base";
1
2
  export interface OrderByOption {
2
3
  column: string;
3
4
  direction: "ASC" | "DESC";
@@ -6,3 +7,4 @@ export interface OrderByOption {
6
7
  export type OrderBy = OrderByOption[];
7
8
  export declare function getOrderByPhrase(orderby: OrderBy): string;
8
9
  export declare function reverseOrderBy(orderby: OrderBy): OrderBy;
10
+ export declare function buildQuery(options: QueryableDataOptions): string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.reverseOrderBy = exports.getOrderByPhrase = void 0;
3
+ exports.buildQuery = exports.reverseOrderBy = exports.getOrderByPhrase = void 0;
4
4
  function getOrderByPhrase(orderby) {
5
5
  return orderby
6
6
  .map((v) => {
@@ -26,3 +26,21 @@ function reverseOrderBy(orderby) {
26
26
  });
27
27
  }
28
28
  exports.reverseOrderBy = reverseOrderBy;
29
+ function buildQuery(options) {
30
+ const fields = options.fields.join(", ");
31
+ // always start at 1
32
+ const whereClause = options.clause.clause(1);
33
+ const parts = [];
34
+ parts.push(`SELECT ${fields} FROM ${options.tableName} WHERE ${whereClause}`);
35
+ if (options.groupby) {
36
+ parts.push(`GROUP BY ${options.groupby}`);
37
+ }
38
+ if (options.orderby) {
39
+ parts.push(`ORDER BY ${getOrderByPhrase(options.orderby)}`);
40
+ }
41
+ if (options.limit) {
42
+ parts.push(`LIMIT ${options.limit}`);
43
+ }
44
+ return parts.join(" ");
45
+ }
46
+ exports.buildQuery = buildQuery;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowtop/ent",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "snowtop ent framework",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",