Class ExpressionBuilder

All Implemented Interfaces:
Serializable, Cloneable

public class ExpressionBuilder extends ObjectExpression

Purpose: Allow for instances of expression to be created. Expressions are Java object-level representations of SQL "where" clauses. The expressions attempt to mirror Java code as closely as possible.

Example:

        ExpressionBuilder employee = new ExpressionBuilder();
        employee.get("firstName").equal("Bob").and(employee.get("lastName").equal("Smith"))

        >> equivalent Java code: (employee.getFirstName().equals("Bob")) && (employee.getLastName().equals("Smith"))

        >> equivalent SQL: (F_NAME = 'Bob') AND (L_NAME = 'Smith')
 
See Also:
  • Field Details

    • session

      protected transient AbstractSession session
    • queryClass

      protected Class<?> queryClass
    • statement

      protected SQLSelectStatement statement
    • viewTable

      protected DatabaseTable viewTable
    • aliasedViewTable

      protected DatabaseTable aliasedViewTable
    • wasQueryClassSetInternally

      protected boolean wasQueryClassSetInternally
    • wasAdditionJoinCriteriaUsed

      protected boolean wasAdditionJoinCriteriaUsed
  • Constructor Details

    • ExpressionBuilder

      public ExpressionBuilder()
      PUBLIC: Create a new ExpressionBuilder.
    • ExpressionBuilder

      public ExpressionBuilder(Class<?> queryClass)
      ADVANCED: Create a new ExpressionBuilder representing instances of the argument class. This can be used for the purpose of parallel expressions. This is a type of query that searches on the relationship between to un-related objects.
  • Method Details

    • equals

      public boolean equals(Object expression)
      INTERNAL: Return if the expression is equal to the other. This is used to allow dynamic expression's SQL to be cached.
      Overrides:
      equals in class ObjectExpression
    • aliasForTable

      public DatabaseTable aliasForTable(DatabaseTable table)
      INTERNAL: Find the alias for a given table. Handle the special case where we are bogus and it should be aliased against our derived tables instead.
      Overrides:
      aliasForTable in class DataExpression
    • assignTableAliasesStartingAt

      public int assignTableAliasesStartingAt(int initialValue)
      INTERNAL: Assign aliases to any tables which I own. Start with t(initialValue), and return the new value of the counter , i.e. if initialValue is one and I have tables ADDRESS and EMPLOYEE I will assign them t1 and t2 respectively, and return 3.
      Overrides:
      assignTableAliasesStartingAt in class ObjectExpression
    • descriptionOfNodeType

      public String descriptionOfNodeType()
      INTERNAL: Used for debug printing.
      Overrides:
      descriptionOfNodeType in class Expression
    • doesNotRepresentAnObjectInTheQuery

      public boolean doesNotRepresentAnObjectInTheQuery()
      INTERNAL: There are cases (which we might want to eliminate?) where the expression builder doesn't actually correspond to an object to be read. Mostly this is the case where it's a data query in terms of tables, and the builder is only there to provide a base. It might be better to make tables able to serve as their own base, but it's very nice to have a known unique, shared base. In the meantime, this is a special case to make sure the builder doesn't get tables assigned.
    • getAliasedViewTable

      public DatabaseTable getAliasedViewTable()
      INTERNAL:
    • getBuilder

      public ExpressionBuilder getBuilder()
      INTERNAL: Return the expression builder which is the ultimate base of this expression, or null if there isn't one (shouldn't happen if we start from a root)
      Overrides:
      getBuilder in class BaseExpression
    • getDescriptor

      public ClassDescriptor getDescriptor()
      INTERNAL: Only usable after the session and class have been set. Return the descriptor for the class this node represents.
      Overrides:
      getDescriptor in class ObjectExpression
    • getQueryClass

      public Class<?> getQueryClass()
      INTERNAL:
    • getSession

      public AbstractSession getSession()
      INTERNAL:
      Overrides:
      getSession in class Expression
    • getStatement

      public SQLSelectStatement getStatement()
      INTERNAL: Return the statement that expression is for. This is used for the context in subselects.
    • getViewTable

      public DatabaseTable getViewTable()
      INTERNAL:
    • hasViewTable

      public boolean hasViewTable()
      INTERNAL:
    • isExpressionBuilder

      public boolean isExpressionBuilder()
      INTERNAL:
      Overrides:
      isExpressionBuilder in class Expression
    • normalize

      public Expression normalize(ExpressionNormalizer normalizer)
      INTERNAL: Normalize the expression into a printable structure. Any joins must be added to form a new root.
      Overrides:
      normalize in class DataExpression
    • printJava

      public void printJava(ExpressionJavaPrinter printer)
      INTERNAL: Print java
      Overrides:
      printJava in class Expression
    • rebuildOn

      public Expression rebuildOn(Expression newBase)
      INTERNAL: This expression is built on a different base than the one we want. Rebuild it and return the root of the new tree This assumes that the original expression has only a single builder.
      Specified by:
      rebuildOn in class Expression
      See Also:
    • resetPlaceHolderBuilder

      public void resetPlaceHolderBuilder(ExpressionBuilder queryBuilder)
      INTERNAL: Search the tree for any expressions (like SubSelectExpressions) that have been built using a builder that is not attached to the query. This happens in case of an Exists call using a new ExpressionBuilder(). This builder needs to be replaced with one from the query.
      Overrides:
      resetPlaceHolderBuilder in class BaseExpression
    • registerIn

      protected Expression registerIn(Map alreadyDone)
      INTERNAL: Override Expression.registerIn to check if the new base expression has already been provided for the clone.
      Overrides:
      registerIn in class Expression
      See Also:
    • setQueryClass

      public void setQueryClass(Class<?> queryClass)
      INTERNAL: Set the class which this node represents.
    • setQueryClassAndDescriptor

      public void setQueryClassAndDescriptor(Class<?> queryClass, ClassDescriptor descriptor)
      INTERNAL: Set the class and descriptor which this node represents.
    • setSession

      public void setSession(AbstractSession session)
      INTERNAL: Set the session in which we expect this expression to be translated. Stored session shall always be root session.
    • setStatement

      public void setStatement(SQLSelectStatement statement)
      INTERNAL: Set the statement that expression is for. This is used for the context in subselects.
    • setViewTable

      public void setViewTable(DatabaseTable theTable)
      INTERNAL: This expression represents something read through a view table.
    • setWasAdditionJoinCriteriaUsed

      public void setWasAdditionJoinCriteriaUsed(boolean joinCriteriaUsed)
      INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement then mark this as true. This will prevent TopLink from adding it again at normalization
    • twistedForBaseAndContext

      public Expression twistedForBaseAndContext(Expression newBase, Expression context, Expression oldBase)
      INTERNAL: Rebuild myself against the base, with the values of parameters supplied by the context expression. This is used for transforming a standalone expression (e.g. the join criteria of a mapping) into part of some larger expression. You normally would not call this directly, instead calling twist See the comment there for more details.
      Overrides:
      twistedForBaseAndContext in class Expression
    • valueFromObject

      public Object valueFromObject(Object object, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)
      INTERNAL: The expression builder represent the entire object, just return it.
      Overrides:
      valueFromObject in class Expression
      Parameters:
      isObjectUnregistered - true if object possibly not a clone, but is being conformed against the unit of work cache.
    • wasAdditionJoinCriteriaUsed

      public boolean wasAdditionJoinCriteriaUsed()
      INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement this method will return true;
    • wasQueryClassSetInternally

      public boolean wasQueryClassSetInternally()
      INTERNAL: Returns true if TopLink set the query class as opposed to the customer. This is important in determining if this Expression should be treated as a parallel expression during normalization
    • getLeafDescriptor

      public ClassDescriptor getLeafDescriptor(DatabaseQuery query, ClassDescriptor rootDescriptor, AbstractSession session)
      INTERNAL: Lookup the descriptor for this item by traversing its expression recursively.
      Overrides:
      getLeafDescriptor in class Expression
    • writeDescriptionOn

      public void writeDescriptionOn(BufferedWriter writer) throws IOException
      INTERNAL: For debug printing purposes.
      Overrides:
      writeDescriptionOn in class Expression
      Throws:
      IOException