321 lines
5.9 KiB
JavaScript
321 lines
5.9 KiB
JavaScript
/*
|
|
|
|
Copyright (c) 2020, 2023, The Unified Company.
|
|
|
|
This code is part of Unify.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the ESA Software Community License - Strong Copyleft LICENSE,
|
|
as published by the ESA.
|
|
See the ESA Software Community License - Strong Copyleft LICENSE, for more details.
|
|
|
|
https://unifyjs.org
|
|
|
|
*/
|
|
|
|
import querySQL from '../../unify/querySQL.js';
|
|
|
|
import joinSQL from '../../unify/joinSQL.js';
|
|
|
|
import tools from '../../unify/tools.js';
|
|
|
|
|
|
export default class queryRoot{
|
|
|
|
queryType = "select";
|
|
|
|
type = "collectionQuery"
|
|
|
|
__className = "queryRoot"
|
|
|
|
prepareSelectQuery( query, object, userQuery ) {
|
|
|
|
query.table = this.collection.getTableName();
|
|
|
|
query.type = this.queryType;
|
|
|
|
query.setFilterAddress( query.table + "/" );
|
|
|
|
query.extractColumns( object, query.table );
|
|
|
|
query.find( "signed", true );
|
|
|
|
query.find( "joined", false );
|
|
|
|
query.debug = userQuery.debug;
|
|
|
|
|
|
return query;
|
|
|
|
}
|
|
|
|
createChildrenJoin( joinTableName, collectionObject, object ) {
|
|
|
|
var childObject = new collectionObject.object()
|
|
|
|
var childObjectName = tools.getClassName( childObject );
|
|
|
|
|
|
var childrenJoin = new joinSQL( );
|
|
|
|
childrenJoin.table = childObjectName;
|
|
|
|
childrenJoin.setFilterAddress( "./" + collectionObject.propertyName + "/" )
|
|
|
|
childrenJoin.joinType = "LEFT";
|
|
|
|
childrenJoin.name = collectionObject.propertyName;
|
|
|
|
childrenJoin.left.table = joinTableName;
|
|
|
|
childrenJoin.left.column = collectionObject.getRight() + "_id";
|
|
|
|
|
|
childrenJoin.right.table = childrenJoin.name;
|
|
|
|
childrenJoin.right.column = "id";
|
|
|
|
|
|
//childrenJoin.find( "signed", true );
|
|
|
|
//childrenJoin.find( "joined", true );
|
|
|
|
|
|
return childrenJoin;
|
|
|
|
}
|
|
|
|
createParentJoin( joinTableName, collectionObject ) {
|
|
|
|
var parentJoin = new joinSQL( );
|
|
|
|
parentJoin.table = this.collection.getTableName();
|
|
|
|
parentJoin.joinType = "INNER";
|
|
|
|
parentJoin.name = "parentJoin";
|
|
|
|
|
|
|
|
parentJoin.left.table = joinTableName;
|
|
|
|
parentJoin.left.column = collectionObject.getLeft() + "_id";
|
|
|
|
parentJoin.right.table = parentJoin.name;
|
|
|
|
parentJoin.right.column = "id";
|
|
|
|
|
|
|
|
|
|
return parentJoin;
|
|
|
|
}
|
|
|
|
createJoinQuery( joinTableName, object, collectionObject ) {
|
|
|
|
var query = new joinSQL( );
|
|
|
|
query.table = joinTableName;
|
|
|
|
query.joinType = "LEFT";
|
|
|
|
|
|
query.name = joinTableName;
|
|
|
|
|
|
|
|
query.left.table = joinTableName;
|
|
|
|
query.left.column = collectionObject.getLeft() + "_id";
|
|
|
|
query.right.table = this.collection.getTableName();
|
|
|
|
query.right.column = "id";
|
|
|
|
query.extractColumns( object, "parentJoin" );
|
|
|
|
|
|
return query;
|
|
|
|
}
|
|
|
|
searchChildrenJoin( child, childrenJoin, filterObject ) {
|
|
|
|
if( filterObject.search ) {
|
|
|
|
var searchables = filterObject.search.findPath( "./" + child.propertyName );
|
|
|
|
|
|
for ( var i = 0; i < searchables.length; i++ ) {
|
|
|
|
var currentSearchable = searchables[i];
|
|
|
|
var columnName = currentSearchable.getColumnName();
|
|
|
|
var searchValue = currentSearchable.getValue();
|
|
|
|
var operator = currentSearchable.getOperator();
|
|
|
|
|
|
if( !searchValue ) {
|
|
|
|
var searchValue = "";
|
|
|
|
}
|
|
|
|
childrenJoin.find( columnName, searchValue, operator, true, true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
composeJoinQuery( query, collectionObject, childrenJoin, parentJoin ) {
|
|
|
|
query.addGroup( collectionObject.getLeft() + "_id" );
|
|
|
|
//childrenJoin.addJoin( );
|
|
|
|
query.addJoin( childrenJoin );
|
|
|
|
//query.addJoin( parentJoin );
|
|
|
|
}
|
|
|
|
createJoinTableName( collectionObject ) {
|
|
|
|
var leftTable = this.collection.getTableName();
|
|
|
|
var rightTable = collectionObject.propertyName;
|
|
|
|
var joinTableName = leftTable + "_" + rightTable;
|
|
|
|
|
|
return joinTableName;
|
|
|
|
}
|
|
|
|
queryFilterChild( query, object, child, filterObject ) {
|
|
|
|
var collectionObject = object[ child.propertyName ];
|
|
|
|
var tableName = collectionObject.tableName;
|
|
|
|
|
|
var joinTableName = this.createJoinTableName( collectionObject );
|
|
|
|
var joinQuery = this.createJoinQuery( joinTableName, object, collectionObject );
|
|
|
|
var childrenJoin = this.createChildrenJoin( joinTableName, collectionObject, object );
|
|
|
|
//var parentJoin = this.createParentJoin( joinTableName, collectionObject );
|
|
|
|
|
|
|
|
|
|
this.composeJoinQuery( joinQuery, collectionObject, childrenJoin );
|
|
|
|
//this.searchChildrenJoin( child, childrenJoin, filterObject );
|
|
|
|
|
|
query.addJoin( joinQuery );
|
|
|
|
//unionQuery.addUnion( joinQuery );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
queryChildren( filterObject, query, client ) {
|
|
|
|
var children = filterObject.getChildren();
|
|
|
|
var joined = false;
|
|
|
|
|
|
|
|
|
|
for( var c = 0; c < children.length; c++ ) {
|
|
|
|
var child = children[c];
|
|
|
|
if( child.type == "collection" ) {
|
|
|
|
var object = new this.collection.object();
|
|
|
|
core.parse( object, client );
|
|
|
|
//console.log("child.propertyName", child);
|
|
|
|
//console.log("filterObject.search", filterObject.search);
|
|
|
|
var tableName = filterObject.getClassName();
|
|
|
|
//console.log("filterObject.search.findPath", "./" + child.tableName );
|
|
|
|
//if( filterObject.search && filterObject.search.findPath( "./" + child.tableName ) ) {
|
|
|
|
if( filterObject.search && filterObject.search.findPath( "./" + child.propertyName ) ) {
|
|
|
|
this.queryFilterChild( query, object, child, filterObject );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
searchQuery( query, filterObject ) {
|
|
|
|
if( filterObject ) {
|
|
|
|
|
|
if( filterObject.search) {
|
|
|
|
filterObject.search.path = query.tableName + "/"
|
|
|
|
}
|
|
|
|
query.filter = filterObject;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
query( userQuery, filterObject, client ) {
|
|
|
|
var core = this.collection.getCore();
|
|
|
|
var object = new this.collection.object();
|
|
|
|
var query = new querySQL();
|
|
|
|
|
|
//console.log("the good ")
|
|
|
|
this.prepareSelectQuery( query, object, userQuery );
|
|
|
|
this.searchQuery( query, filterObject );
|
|
|
|
this.collection.filterQuery( query, filterObject );
|
|
|
|
this.queryChildren( filterObject, query, client );
|
|
|
|
|
|
query.debug = userQuery.debug;
|
|
|
|
|
|
|
|
var parentResult = global.database.query( query );
|
|
|
|
|
|
return parentResult;
|
|
|
|
}
|
|
|
|
} |