"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?