@snowtop/ent 0.1.8 → 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.
- package/action/operations.js +2 -1
- package/core/clause.d.ts +2 -0
- package/core/clause.js +49 -1
- package/core/config.d.ts +1 -0
- package/core/ent.d.ts +1 -2
- package/core/ent.js +4 -23
- package/core/logger.js +1 -0
- package/core/query_impl.d.ts +2 -0
- package/core/query_impl.js +19 -1
- package/package.json +1 -1
- package/schema/schema.d.ts +2 -0
package/action/operations.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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
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,
|
|
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.
|
|
30
|
-
exports.getEdgeTypeInGroup =
|
|
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
package/core/query_impl.d.ts
CHANGED
|
@@ -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;
|
package/core/query_impl.js
CHANGED
|
@@ -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
package/schema/schema.d.ts
CHANGED
|
@@ -61,6 +61,7 @@ export interface EdgeAction {
|
|
|
61
61
|
graphQLName?: string;
|
|
62
62
|
actionOnlyFields?: ActionField[];
|
|
63
63
|
canViewerDo?: boolean | CanViewerDo;
|
|
64
|
+
__canFailBETA?: boolean;
|
|
64
65
|
}
|
|
65
66
|
export interface InverseAssocEdge {
|
|
66
67
|
name: string;
|
|
@@ -315,6 +316,7 @@ export interface Action {
|
|
|
315
316
|
requiredFields?: string[];
|
|
316
317
|
noFields?: boolean;
|
|
317
318
|
canViewerDo?: boolean | CanViewerDo;
|
|
319
|
+
__canFailBETA?: boolean;
|
|
318
320
|
[x: string]: any;
|
|
319
321
|
}
|
|
320
322
|
export interface CanViewerDo {
|