Class WurbletArgument

java.lang.Object
org.tentackle.wurblet.WurbletArgument
All Implemented Interfaces:
WurbletArgumentOperand

public class WurbletArgument extends Object implements WurbletArgumentOperand
A wurblet argument.

There are 4 WurbletArgumentTypes:

  • property condition: refers to an Entity's Attribute that must meet a condition.
  • property update: defines an Entity's Attribute that will be updated.
  • property sorting: define the sorting according to an Entity's Attribute.
  • load join: describes a Relation that will be eagerly loaded.

An argument is of the form:

[*|+|-][Relation|.Entity[.Relation...]][Attribute[#column][[name]]][:relop[:value|#value]]

  • argument type:
    • default (missing): attribute as a condition or for update
    • + or -: sorting criteria (+ for ascending, - for descending)
    • *: load join
  • relation-path: list of relations.
    Optional for conditions, required for load joins. Illegal for updates and sorting.
    If the current entity is a root-entity, the path starts with a dot and is followed by the name of a pointsToComponent, the pointsToComponent is replaced by its relation path, if there is only one path.
    For load joins, asterisks must be used between joins. Each join path element can be filtered by appending a pipe-character followed by the filter expression, which in turn consists of wurblet arguments. Filters with more than one argument must be enclosed in single- or double quotes (see ArgScanner). Notice that for filtered load joins the returned PDOs are automatically made immutable since they may be incomplete and should not be modified and/or written back to the database!
  • attribute: a property of an entity.
    Required for conditions, updates, sorting. Illegal for joins.
  • column: the optional column suffix or getter name for multi-column types. If missing and the multi-column type defines a default column, this column is taken. A * will explicitly select all columns.
  • name: optional name of the method argument.
    Only allowed for conditions and updates.
  • relop-expression: optional relop.
    Only allowed for conditions.
    Defaults to '='.
    The special relop ':null' will be translated to " IS NULL" and ':notnull' translated to " IS NOT NULL".
    ':like' will translated to " LIKE ". ':notlike' will be translated to " NOT LIKE ".
    ':in', ':notin' or if the relop ends with 'any' or 'all', it will be translated to IN(?), NOT IN(?), ANY(?) or ALL(?) operators with its argument being an array instead of a simple value. Notice that backends may not support array operators at all or only a subset. This is verified by the wurblets.
    The optional ':value' will be set as a '?'-parameter of the generated prepared statement. As an alternative, the value may be given as '#value' which will include the value literally in the SQL-string.
 Examples:
          poolId                      -> attribute=poolId, arg=poolId, relop="="
          poolId[from]:>=             -> attribute=poolId, arg=from, relop=">="
          code:=:"Hurrz"              -> attribute=code, relop="=", value="Hurz"
          code:=#"Hurrz"              -> attribute=code, relop="=", value="Hurz", literally=true

          +poolId -kurzname           -> ORDER BY pool_id ASC, kurzname DESC

          invoice.lines.currencyId    -> SQL WHERE condition for currency_id
          .InvoiceLine.currencyId     -> equivalent to the above

          *invoice*lines              -> joins the invoice and its lines (chained join)
          *invoice*lines|no:<:10      -> equivalent to the above with filter "no < 10"
          *invoice|date:>=*lines      -> same with filter on invoice date "date >= ?"

          blahId:=ANY                 -> attribute blahId as an array, SQL relop is =ANY(?)

 
Author:
harald
  • Constructor Details

    • WurbletArgument

      public WurbletArgument(Entity entity, int index, String text, boolean expressionFinished, boolean argumentGroupingEnabled) throws org.wurbelizer.wurbel.WurbelException
      Constructs a wurblet argument.

      Parameters:
      entity - the entity the wurblet is applied to
      index - the position among all arguments
      text - the wurblet arg
      expressionFinished - true if expression is finished
      argumentGroupingEnabled - true if argument grouping is enabled
      Throws:
      org.wurbelizer.wurbel.WurbelException - if parsing failed
  • Method Details

    • getEntity

      public Entity getEntity()
      Gets the entity the wurblet is applied to.
      Returns:
      the entity
    • getIndex

      public int getIndex()
      Gets the index within the wurblet anchor.
      Returns:
      the index, lower comes first
    • getText

      public String getText()
      Gets the original text.
      Returns:
      the text
    • getArgumentType

      public WurbletArgumentType getArgumentType()
      Gets the argument type.
      Returns:
      the type, never null
    • getAttribute

      public Attribute getAttribute()
      Gets the model attribute.
      Returns:
      the attribute
    • getDataType

      public org.tentackle.sql.DataType<?> getDataType()
      Gets the effective datatype of the attribute.
      Returns:
      the datatype
    • getColumnIndex

      public Integer getColumnIndex()
      Gets the datatype column index.
      Returns:
      the index if column specified, else null
    • getWurbletRelations

      public List<WurbletRelation> getWurbletRelations()
      Gets the relation path.

      If the path starts with a component, the relations start there.

      Returns:
      the relations, null if refers directly to the wurblet's entity
    • getEmbeddingPath

      public List<Relation> getEmbeddingPath()
      Gets the embedding relation path to the attribute.
      Starts at the embedding entity.
      Returns:
      the relation path, if attribute is embedded, empty list if not
    • getEmbeddingPrefixCount

      public int getEmbeddingPrefixCount()
      Gets the embedding prefix count.
      The embedding prefixes are only necessary for chained embedding relations, i.e. relations from within an embedded entity which is embedded in at least one other embedded entity. This is used in wurblet joins (and fetch joins) only.
      Returns:
      the embedding count, 0 if no prefixing necessary.
    • getEmbeddingColumnPrefix

      public String getEmbeddingColumnPrefix()
      Gets the column prefix for nested embedded relations.
      Returns:
      the column prefix, empty string if none
      See Also:
    • getEmbeddingGetterPrefix

      public String getEmbeddingGetterPrefix()
      Gets the getter prefix for nested embedded relations.
      Returns:
      the getter prefix, empty string if none
      See Also:
    • getExistsRelations

      public Set<Relation> getExistsRelations()
      Sets the relations used within the current SQL EXISTS clause.
      Returns:
      the relations, null if argument has no relations or already covered by EXISTS-clause
    • setExistsRelations

      public void setExistsRelations(Set<Relation> existsRelations)
      Sets the relations used within the current SQL EXISTS clause.
      Parameters:
      existsRelations - the effective relations
    • getExistsComponents

      public Set<Entity> getExistsComponents()
      Gets the components for the current SQL EXISTS clause.
      Returns:
      the components, null if argument has no relations or already covered by EXISTS-clause
    • setExistsComponents

      public void setExistsComponents(Set<Entity> existsComponents)
      Sets the components for the current SQL EXISTS clause.
      Parameters:
      existsComponents - the components
    • isEndOfExistsClause

      public boolean isEndOfExistsClause()
      Returns whether this is the last argument of the current SQL EXISTS clause.
      Returns:
      true if finish clause
    • setEndOfExistsClause

      public void setEndOfExistsClause(boolean endOfExistsClause)
      Sets whether this is the last argument of the current SQL EXISTS clause.
      Parameters:
      endOfExistsClause - true if finish clause
    • getExpressionRelations

      public List<Relation> getExpressionRelations()
      Gets the compacted relation path starting with the last component relation in chain, if any.
      Returns:
      the relation path to be used in expressions, null if refers directly to the wurblet's entity
    • getComponent

      public Entity getComponent()
      Gets the component that prepends the relation path.
      Returns:
      the component, null if path does not start with a component
    • isPath

      public boolean isPath()
      Returns whether argument points to another entity.
      Returns:
      true if argument describes a path to another entity
    • getSortType

      public SortType getSortType()
      Gets the sorting type if this a sorting criteria argument.
      Returns:
      ASC or DESC, null if not a sorting argument
    • getName

      public String getName()
      Gets the optional name of the method argument.
      Returns:
      the argument name, null if default attribute name
    • isMethodArgument

      public boolean isMethodArgument()
      Returns whether this is a method argument.
      Returns:
      true if attribute set and value is null
    • getMethodArgumentName

      public String getMethodArgumentName() throws org.wurbelizer.wurbel.WurbelException
      Gets the effective name of the method argument.
      This is ether the optionally defined [name] or the name of the Attribute.
      Returns:
      the method argument name, never null
      Throws:
      org.wurbelizer.wurbel.WurbelException - if argument type provides no argument name
    • getJdbcValue

      public String getJdbcValue() throws org.wurbelizer.wurbel.WurbelException, ModelException
      Gets the value to be used in JDBC prepared statements.
      Returns:
      the JDBC value
      Throws:
      org.wurbelizer.wurbel.WurbelException - if failed
      ModelException
    • getRelop

      public String getRelop()
      Gets the relational operator.
      Returns:
      the relop
    • getValue

      public String getValue()
      Gets the predefined value.
      Returns:
      the value
    • isValueLiterally

      public boolean isValueLiterally()
      fixed value (directly put into sql-statement).
      Returns:
      the fixed
    • isArray

      public boolean isArray()
      Returns whether argument must be treated as an array.
      Returns:
      true if IN, ANY or ALL operators used
    • getArrayOperator

      public String getArrayOperator()
      Returns the array operator.
      Returns:
      IN, ANY or ALL, null if no array relop
    • toString

      public String toString()
      Overrides:
      toString in class Object