You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.2 KiB
JavaScript

"use strict";
// FIXME: Validation for all methods
// FIXME: For validation of things where there are defaults/implicits, make sure to strictly validate either the allowed operations OR the allowed implicit values (eg. `columnName` implicits should only accept strings) - these validations can be abstracted out per type of implicit
// FIXME: Upon query compilation, keep a 'stack' of operation types, to track what context we are in (eg. because values can only be parameterized in some contexts)
// FIXME: Verify that all wrapWith calls have a corresponding isObjectType arm
require("array.prototype.flat").shim();
const node = require("../ast-node");
const evaluateCyclicalModulesOnto = require("../evaluate-cyclical-modules-onto");
// NOTE: withDerived has been replaced with compute
// FIXME: All of the below need to be refactored, and moved into operation modules
let operations = {
withRelations: function (relations) {
// FIXME: Default relation types for literal column names and table.column syntax
// FIXME: Flesh this out further
// Main types: hasMany, belongsTo; hasOne is just hasMany with a 'single' constraint; simplify hasMany to 'has'?
// through relation is actually hasMany(through(...)) -- how to make `through` itself composable?
// test case for composable through: user -> membership -> usergroup -> community
// should fold composed throughs in compiler step
return node({
type: "withRelations",
relations: Object.entries(relations).map(([ key, relation ]) => {
return {
key: key,
relation: normalizeRelation(relation)
};
})
});
}
};
// FIXME: first() and first({ optional: true })
// TODO: Boolean subquery operations (UNION, INTERSECT, EXCEPT) with {keepDuplicates} option: https://www.postgresql.org/docs/9.4/queries-union.html
let operationModules = {
// Base operations
select: require("./select"),
// Field selection
addFields: require("./add-fields"),
onlyFields: require("./only-fields"),
alias: require("./alias"),
// Reference/scalar types
field: require("./field"),
remoteField: require("./remote-field"),
collection: require("./collection"),
value: require("./value"),
// Filtering
where: require("./where"),
expression: require("./expression"),
// Predicate lists/combinators
allOf: require("./all-of"),
anyOf: require("./any-of"),
// Conditions
equals: require("./equals"),
lessThan: require("./less-than"),
moreThan: require("./more-than"),
not: require("./not"),
// Collapsing/grouping
collapseBy: require("./collapse-by"),
hierarchical: require("./hierarchical"),
// Computation
compute: require("./compute"),
// Aggregrate functions
count: require("./count"),
sum: require("./sum"),
// Relations and subqueries
belongsTo: require("./relations/belongs-to"),
has: require("./relations/has"),
through: require("./relations/through"),
withRelations: require("./relations/with-relations"),
define: require("./relations/define"),
producesResult: require("./relations/produces-result"),
linkTo: require("./relations/link-to"),
// Misc.
parameter: require("./parameter"),
postProcess: require("./post-process"),
unsafeSQL: require("./unsafe-sql"),
now: require("./functions/now"),
// Schema definitions
createCollection: require("./schema/create-collection"),
changeCollection: require("./schema/change-collection"),
deleteCollection: require("./schema/delete-collection"),
fields: require("./schema/fields"),
indexes: require("./schema/indexes"),
deleteField: require("./schema/delete-field"),
restoreAs: require("./schema/restore-as"),
// FIXME: unsafeRestoreAsNull
optional: require("./schema/optional"),
defaultTo: require("./schema/default-to"),
// Field types
autoID: require("./types/auto-id"),
boolean: require("./types/boolean"),
string: require("./types/string"),
uuid: require("./types/uuid"),
timestamp: require("./types/timestamp"),
// Index types
primaryKey: require("./indexes/primary-key"),
index: require("./indexes/index"),
unique: require("./indexes/unique"),
};
Object.assign(module.exports, operations);
evaluateCyclicalModulesOnto(module.exports, operationModules);
// NOTE: normalizeExpression should sometimes only accept sql/literal, but sometimes also sql/literal/condition?