package io.ebeaninternal.server.query;
import io.ebeaninternal.api.SpiQuery;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
Represents the SELECT clause part of the SQL query.
/**
* Represents the SELECT clause part of the SQL query.
*/
class SqlTree {
private final SqlTreeNode rootNode;
Property if resultSet contains master and detail rows.
/**
* Property if resultSet contains master and detail rows.
*/
private final STreePropertyAssocMany manyProperty;
private final String distinctOn;
private final String selectSql;
private final String fromSql;
private final String groupBy;
Encrypted Properties require additional binding.
/**
* Encrypted Properties require additional binding.
*/
private final STreeProperty[] encryptedProps;
Where clause for inheritance.
/**
* Where clause for inheritance.
*/
private final String inheritanceWhereSql;
private final boolean noJoins;
Create the SqlSelectClause.
/**
* Create the SqlSelectClause.
*/
SqlTree(SqlTreeNode rootNode, String distinctOn, String selectSql, String fromSql, String groupBy, String inheritanceWhereSql,
STreeProperty[] encryptedProps, STreePropertyAssocMany manyProperty, boolean includeJoins) {
this.rootNode = rootNode;
this.distinctOn = distinctOn;
this.selectSql = selectSql;
this.fromSql = fromSql;
this.groupBy = groupBy;
this.inheritanceWhereSql = inheritanceWhereSql;
this.encryptedProps = encryptedProps;
this.manyProperty = manyProperty;
this.noJoins = !includeJoins;
}
Return true if the query mandates SQL Distinct due to ToMany inclusion.
/**
* Return true if the query mandates SQL Distinct due to ToMany inclusion.
*/
boolean isSqlDistinct() {
return rootNode.isSqlDistinct();
}
Return true if the query includes joins (not valid for rawSql).
/**
* Return true if the query includes joins (not valid for rawSql).
*/
boolean noJoins() {
return noJoins;
}
Recurse through the tree adding an table alias' for @History entity beans.
/**
* Recurse through the tree adding an table alias' for @History entity beans.
*/
void addAsOfTableAlias(SpiQuery<?> query) {
rootNode.addAsOfTableAlias(query);
}
Recurse through the tree adding soft delete predicates as necessary.
/**
* Recurse through the tree adding soft delete predicates as necessary.
*/
void addSoftDeletePredicate(SpiQuery<?> query) {
rootNode.addSoftDeletePredicate(query);
}
Build a select expression chain for RawSql.
/**
* Build a select expression chain for RawSql.
*/
public List<String> buildRawSqlSelectChain() {
ArrayList<String> list = new ArrayList<>();
rootNode.buildRawSqlSelectChain(list);
return list;
}
String getDistinctOn() {
return distinctOn;
}
Return the String for the actual SQL.
/**
* Return the String for the actual SQL.
*/
String getSelectSql() {
return selectSql;
}
String getFromSql() {
return fromSql;
}
Return the groupBy clause.
/**
* Return the groupBy clause.
*/
String getGroupBy() {
return groupBy;
}
Return the where clause for inheritance.
/**
* Return the where clause for inheritance.
*/
String getInheritanceWhereSql() {
return inheritanceWhereSql;
}
SqlTreeNode getRootNode() {
return rootNode;
}
Return the property that is associated with the many. There can only be one
per SqlSelect. This can be null.
/**
* Return the property that is associated with the many. There can only be one
* per SqlSelect. This can be null.
*/
STreePropertyAssocMany getManyProperty() {
return manyProperty;
}
STreeProperty[] getEncryptedProps() {
return encryptedProps;
}
Return true if the query has a many join.
/**
* Return true if the query has a many join.
*/
boolean hasMany() {
return manyProperty != null || rootNode.hasMany();
}
boolean isSingleProperty() {
return rootNode.isSingleProperty();
}
Return the tables that are joined in this query.
/**
* Return the tables that are joined in this query.
*/
Set<String> dependentTables() {
Set<String> tables = new LinkedHashSet<>();
rootNode.dependentTables(tables);
return tables;
}
}