/** * INTERNAL: */ public Expression newDerivedTable(DatabaseTable table) { TableExpression result = new TableExpression(table); result.setBaseExpression(this); addDerivedTable(result); return result; }
/** * INTERNAL: * Any table should use the sub-selects alias. */ @Override public DatabaseTable aliasForTable(DatabaseTable table) { return super.aliasForTable(getTable()); }
/** * INTERNAL: * This expression is built on a different base than the one we want. Rebuild it and * return the root of the new tree */ @Override public Expression rebuildOn(Expression newBase) { Expression newLocalBase = getBaseExpression().rebuildOn(newBase); return newLocalBase.getTable(getTable()); }
/** * INTERNAL: * Used to print a debug form of the expression tree. */ @Override public void writeDescriptionOn(BufferedWriter writer) throws IOException { writer.write(getTable().toString()); writer.write(tableAliasesDescription()); } }
/** * INTERNAL: */ @Override public List<DatabaseTable> getOwnedTables() { List<DatabaseTable> result = new ArrayList(1); result.add(getTable()); return result; }
/** * INTERNAL: * Fully-qualify the databaseField if the table is known. * CR 3791 */ public Expression getField(String fieldName) { // we need to check for full table qualification DatabaseField field = new DatabaseField(fieldName); if (!field.hasTableName()) { field.setTable(getTable()); } return getField(field); }
/** * INTERNAL: * Print SQL onto the stream, using the ExpressionPrinter for context */ @Override public void printSQL(ExpressionSQLPrinter printer) { if (isAttribute()) { printer.printField(getAliasedField()); } // If the mapping is a direct collection then this falls into a gray area. // It must be treated as an attribute at this moment for it has a direct field. // However it is not an attribute in the sense that it also represents a foreign // reference and a mapping criteria has been added. // For bug 2900974 these are now handled as non-attributes during normalize but // as attributes when printing SQL. // if ((!isAttribute()) && (getMapping() != null) && getMapping().isDirectCollectionMapping()) { DirectCollectionMapping directCollectionMapping = (DirectCollectionMapping)getMapping(); // The aliased table comes for free as it was a required part of the join criteria. TableExpression table = (TableExpression)getTable(directCollectionMapping.getReferenceTable()); DatabaseTable aliasedTable = table.aliasForTable(table.getTable()); DatabaseField aliasedField = directCollectionMapping.getDirectField().clone(); aliasedField.setTable(aliasedTable); printer.printField(aliasedField); } if ((getMapping() != null) && getMapping().isNestedTableMapping()) { DatabaseTable tableAlias = aliasForTable(new NestedTable(this)); printer.printString(tableAlias.getName()); } }
protected void initializeSelectionCriteria(AbstractSession session) { Expression criteria = null; ExpressionBuilder base = new ExpressionBuilder(); TableExpression table = (TableExpression)base.getTable(getReferenceTable()); Iterator<DatabaseField> referenceKeys = getReferenceKeyFields().iterator(); Iterator<DatabaseField> sourceKeys = getSourceKeyFields().iterator(); while (referenceKeys.hasNext()) { DatabaseField referenceKey = referenceKeys.next(); DatabaseField sourceKey = sourceKeys.next(); Expression expression = table.getField(referenceKey).equal(base.getParameter(sourceKey)); if (criteria == null) { criteria = expression; } else { criteria = expression.and(criteria); } } setSelectionCriteria(criteria); }
/** * ADVANCED: Return an expression representing a sub-select in the from clause. * <p> Example: * <pre><blockquote> * builder.getAlias(builder.subQuery(reportQuery)).get("type").equal("S"); * </blockquote></pre> */ @Override public Expression getAlias(Expression subSelect) { TableExpression result = new FromSubSelectExpression((SubSelectExpression)subSelect); result.setBaseExpression(this); return result; }
/** * INTERNAL: * Also iterate over the sub-select if present. */ @Override public void iterateOn(ExpressionIterator iterator) { super.iterateOn(iterator); if (this.subSelect != null) { this.subSelect.iterateOn(iterator); } }
/** * INTERNAL: * Normalize the expression into a printable structure. * Any joins must be added to form a new root. */ @Override public Expression normalize(ExpressionNormalizer normalizer) { if (this.subSelect != null) { // Each item that is a function must have an alias defined for it. for (ReportItem item : this.subSelect.getSubQuery().getItems()) { if (!item.getAttributeExpression().isQueryKeyExpression()) { item.setAttributeExpression(item.getAttributeExpression().as(item.getName())); } } // Need to force the sub-slect to normalize instead of deferring. this.subSelect.normalizeSubSelect(normalizer, normalizer.getClonedExpressions()); } return super.normalize(normalizer); }
/** * INTERNAL: */ public Vector getOwnedTables() { Vector result = new Vector(1); result.addElement(getTable()); return result; }
/** * INTERNAL: * Used to print a debug form of the expression tree. */ @Override public void writeDescriptionOn(BufferedWriter writer) throws IOException { writer.write(getTable().toString()); writer.write(tableAliasesDescription()); } }
/** * INTERNAL: * Fully-qualify the databaseField if the table is known. * CR 3791 */ @Override public Expression getField(String fieldName) { // we need to check for full table qualification DatabaseField field = new DatabaseField(fieldName); if (!field.hasTableName()) { field.setTable(getTable()); } return getField(field); }
/** * INTERNAL: * Print SQL onto the stream, using the ExpressionPrinter for context */ public void printSQL(ExpressionSQLPrinter printer) { if (isAttribute()) { printer.printField(getAliasedField()); } // If the mapping is a direct collection then this falls into a gray area. // It must be treated as an attribute at this moment for it has a direct field. // However it is not an attribute in the sense that it also represents a foreign // reference and a mapping criteria has been added. // For bug 2900974 these are now handled as non-attributes during normalize but // as attributes when printing SQL. // if ((!isAttribute()) && (getMapping() != null) && getMapping().isDirectCollectionMapping()) { DirectCollectionMapping directCollectionMapping = (DirectCollectionMapping)getMapping(); // The aliased table comes for free as it was a required part of the join criteria. TableExpression table = (TableExpression)getTable(directCollectionMapping.getReferenceTable()); DatabaseTable aliasedTable = table.aliasForTable(table.getTable()); DatabaseField aliasedField = (DatabaseField)directCollectionMapping.getDirectField().clone(); aliasedField.setTable(aliasedTable); printer.printField(aliasedField); } if ((getMapping() != null) && getMapping().isNestedTableMapping()) { DatabaseTable tableAlias = aliasForTable(new NestedTable(this)); printer.printString(tableAlias.getName()); } }
protected void initializeSelectionCriteria(AbstractSession session) { Expression criteria = null; ExpressionBuilder base = new ExpressionBuilder(); TableExpression table = (TableExpression)base.getTable(getReferenceTable()); Iterator<DatabaseField> referenceKeys = getReferenceKeyFields().iterator(); Iterator<DatabaseField> sourceKeys = getSourceKeyFields().iterator(); while (referenceKeys.hasNext()) { DatabaseField referenceKey = referenceKeys.next(); DatabaseField sourceKey = sourceKeys.next(); Expression expression = table.getField(referenceKey).equal(base.getParameter(sourceKey)); if (criteria == null) { criteria = expression; } else { criteria = expression.and(criteria); } } setSelectionCriteria(criteria); }
/** * ADVANCED: Return an expression representing a sub-select in the from clause. * <p> Example: * <pre><blockquote> * builder.getAlias(builder.subQuery(reportQuery)).get("type").equal("S"); * </blockquote></pre> */ @Override public Expression getAlias(Expression subSelect) { TableExpression result = new FromSubSelectExpression((SubSelectExpression)subSelect); result.setBaseExpression(this); return result; }
/** * INTERNAL: * Also iterate over the sub-select if present. */ @Override public void iterateOn(ExpressionIterator iterator) { super.iterateOn(iterator); if (this.subSelect != null) { this.subSelect.iterateOn(iterator); } }