/* 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; } }