Package org.h2.table
Class TableFilter
- java.lang.Object
-
- org.h2.table.TableFilter
-
- All Implemented Interfaces:
ColumnResolver
public class TableFilter extends java.lang.Object implements ColumnResolver
A table filter represents a table that is used in a query. There is one such object whenever a table (or view) is used in a query. For example the following query has 2 table filters: SELECT * FROM TEST T1, TEST T2.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceTableFilter.TableFilterVisitorA visitor for table filters.
-
Field Summary
Fields Modifier and Type Field Description protected booleanjoinOuterIndirectWhether this is a direct or indirect (nested) outer joinstatic java.util.Comparator<TableFilter>ORDER_IN_FROM_COMPARATORComparator that uses order in FROM clause as a sort key.
-
Constructor Summary
Constructors Constructor Description TableFilter(SessionLocal session, Table table, java.lang.String alias, boolean rightsChecked, Select select, int orderInFrom, IndexHints indexHints)Create a new table filter object.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddCommonJoinColumns(Column leftColumn, Column replacementColumn, TableFilter replacementFilter)Add a column to the common join column list for a left table filter.voidaddCommonJoinColumnToExclude(Column columnToExclude)Add an excluded column to the common join column list.voidaddFilter(Expression on)Add the join condition.voidaddFilterCondition(Expression condition, boolean isJoin)Add a filter condition.voidaddIndexCondition(IndexCondition condition)Add an index condition.voidaddJoin(TableFilter filter, boolean outer, Expression on)Add a joined table.voidcreateIndexConditions()Create the index conditions for this filter if needed.ColumnfindColumn(java.lang.String name)Get the column with the specified name.Rowget()Get the current row.PlanItemgetBestPlanItem(SessionLocal s, TableFilter[] filters, int filter, AllColumnsForPlan allColumnsSet, boolean isSelectCommand)Get the best plan item (index, cost) to use for the current join order.ColumngetColumn(java.lang.String columnName, boolean ifExists)Get the column with the given name.java.lang.StringgetColumnName(Column column)Get the name of the specified column.Column[]getColumns()Get the column list.java.util.LinkedHashMap<Column,Column>getCommonJoinColumns()Returns common join columns map.TableFiltergetCommonJoinColumnsFilter()Returns common join columns table filter.ExpressiongetFilterCondition()IndexgetIndex()IndexHintsgetIndexHints()TableFiltergetJoin()ExpressiongetJoinCondition()int[]getMasks()TableFiltergetNestedJoin()intgetOrderInFrom()Get the order number (index) of this table filter in the "from" clause of the query.java.lang.StringBuildergetPlanSQL(java.lang.StringBuilder builder, boolean isJoin, int sqlFlags)Get the query execution plan text to use for this table filter and append it to the specified builder.ColumngetRowIdColumn()Get the row id pseudo column, if there is one.java.lang.StringgetSchemaName()Get the schema name or null.SelectgetSelect()Get the select statement.SessionLocalgetSession()Column[]getSystemColumns()Get the system columns that this table understands.TablegetTable()java.lang.StringgetTableAlias()Get the table alias name.TableFiltergetTableFilter()Get the table filter.ValuegetValue(Column column)Get the value for the given column.booleanhasDerivedColumnList()Returns whether this column resolver has a derived column list.booleanhasFromClause()Returns whether this is a table filter with implicit DUAL table for a SELECT without a FROM clause.inthashCode()booleanisCommonJoinColumnToExclude(Column c)Check if the given column is an excluded common join column.booleanisEvaluatable()booleanisJoinOuter()Whether this is an outer joined table.booleanisJoinOuterIndirect()Whether this is indirectly an outer joined table (nested within an inner join).booleanisNullRow()booleanisUsed()voidlock(SessionLocal s)Lock the table.voidmapColumns(ColumnResolver resolver, int level, boolean outer)Map the columns to the given column resolver.booleannext()Check if there are more rows to read.voidprepare()Prepare reading rows.voidremoveFilterCondition()Remove the filter condition.voidremoveJoin()Remove the joined tablevoidremoveJoinCondition()Remove the join condition.voidreset()Reset to the current position.voidset(Row current)Set the current row.voidsetAlias(java.lang.String alias)voidsetDerivedColumns(java.util.ArrayList<java.lang.String> derivedColumnNames)Set derived column list.voidsetEvaluatable(boolean evaluatable)voidsetEvaluatable(TableFilter filter, boolean b)Update the filter and join conditions of this and all joined tables with the information that the given table filter and all nested filter can now return rows or not.voidsetFullCondition(Expression condition)voidsetIndex(Index index, boolean reverse)voidsetNestedJoin(TableFilter filter)Set a nested joined table.protected voidsetNullRow()Set the state of this and all nested tables to the NULL row.voidsetPlanItem(PlanItem item)Set what plan item (index, cost, masks) to use.voidsetUsed(boolean used)voidstartQuery(SessionLocal s)Start the query.java.lang.StringtoString()voidvisit(TableFilter.TableFilterVisitor visitor)Visit this and all joined or nested table filters.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.h2.table.ColumnResolver
optimize
-
-
-
-
Field Detail
-
ORDER_IN_FROM_COMPARATOR
public static final java.util.Comparator<TableFilter> ORDER_IN_FROM_COMPARATOR
Comparator that uses order in FROM clause as a sort key.
-
joinOuterIndirect
protected boolean joinOuterIndirect
Whether this is a direct or indirect (nested) outer join
-
-
Constructor Detail
-
TableFilter
public TableFilter(SessionLocal session, Table table, java.lang.String alias, boolean rightsChecked, Select select, int orderInFrom, IndexHints indexHints)
Create a new table filter object.- Parameters:
session- the sessiontable- the table from where to read dataalias- the alias namerightsChecked- true if rights are already checkedselect- the select statementorderInFrom- original order number (index) of this table filter inindexHints- the index hints to be used by the query planner
-
-
Method Detail
-
getOrderInFrom
public int getOrderInFrom()
Get the order number (index) of this table filter in the "from" clause of the query.- Returns:
- the index (0, 1, 2,...)
-
getSelect
public Select getSelect()
Description copied from interface:ColumnResolverGet the select statement.- Specified by:
getSelectin interfaceColumnResolver- Returns:
- the select statement
-
getTable
public Table getTable()
-
lock
public void lock(SessionLocal s)
Lock the table. This will also lock joined tables.- Parameters:
s- the session
-
getBestPlanItem
public PlanItem getBestPlanItem(SessionLocal s, TableFilter[] filters, int filter, AllColumnsForPlan allColumnsSet, boolean isSelectCommand)
Get the best plan item (index, cost) to use for the current join order.- Parameters:
s- the sessionfilters- all joined table filtersfilter- the current table filter indexallColumnsSet- the set of all columns- Returns:
- the best plan item
-
setPlanItem
public void setPlanItem(PlanItem item)
Set what plan item (index, cost, masks) to use.- Parameters:
item- the plan item
-
prepare
public void prepare()
Prepare reading rows. This method will remove all index conditions that can not be used, and optimize the conditions.
-
startQuery
public void startQuery(SessionLocal s)
Start the query. This will reset the scan counts.- Parameters:
s- the session
-
reset
public void reset()
Reset to the current position.
-
next
public boolean next()
Check if there are more rows to read.- Returns:
- true if there are
-
isNullRow
public boolean isNullRow()
-
setNullRow
protected void setNullRow()
Set the state of this and all nested tables to the NULL row.
-
get
public Row get()
Get the current row.- Returns:
- the current row, or null
-
set
public void set(Row current)
Set the current row.- Parameters:
current- the current row
-
getTableAlias
public java.lang.String getTableAlias()
Get the table alias name. If no alias is specified, the table name is returned.- Specified by:
getTableAliasin interfaceColumnResolver- Returns:
- the alias name
-
addIndexCondition
public void addIndexCondition(IndexCondition condition)
Add an index condition.- Parameters:
condition- the index condition
-
addFilterCondition
public void addFilterCondition(Expression condition, boolean isJoin)
Add a filter condition.- Parameters:
condition- the conditionisJoin- if this is in fact a join condition
-
addJoin
public void addJoin(TableFilter filter, boolean outer, Expression on)
Add a joined table.- Parameters:
filter- the joined table filterouter- if this is an outer joinon- the join condition
-
setNestedJoin
public void setNestedJoin(TableFilter filter)
Set a nested joined table.- Parameters:
filter- the joined table filter
-
addFilter
public void addFilter(Expression on)
Add the join condition.- Parameters:
on- the condition
-
mapColumns
public void mapColumns(ColumnResolver resolver, int level, boolean outer)
Map the columns to the given column resolver.- Parameters:
resolver- the resolverlevel- the subquery level (0 is the top level query, 1 is the first subquery level)outer- whether this method was called from the outer query
-
createIndexConditions
public void createIndexConditions()
Create the index conditions for this filter if needed.
-
getJoin
public TableFilter getJoin()
-
isJoinOuter
public boolean isJoinOuter()
Whether this is an outer joined table.- Returns:
- true if it is
-
isJoinOuterIndirect
public boolean isJoinOuterIndirect()
Whether this is indirectly an outer joined table (nested within an inner join).- Returns:
- true if it is
-
getPlanSQL
public java.lang.StringBuilder getPlanSQL(java.lang.StringBuilder builder, boolean isJoin, int sqlFlags)Get the query execution plan text to use for this table filter and append it to the specified builder.- Parameters:
builder- string builder to append toisJoin- if this is a joined tablesqlFlags- formatting flags- Returns:
- the specified builder
-
getMasks
public int[] getMasks()
-
getIndex
public Index getIndex()
-
setIndex
public void setIndex(Index index, boolean reverse)
-
setUsed
public void setUsed(boolean used)
-
isUsed
public boolean isUsed()
-
removeJoin
public void removeJoin()
Remove the joined table
-
getJoinCondition
public Expression getJoinCondition()
-
removeJoinCondition
public void removeJoinCondition()
Remove the join condition.
-
getFilterCondition
public Expression getFilterCondition()
-
removeFilterCondition
public void removeFilterCondition()
Remove the filter condition.
-
setFullCondition
public void setFullCondition(Expression condition)
-
setEvaluatable
public void setEvaluatable(TableFilter filter, boolean b)
Update the filter and join conditions of this and all joined tables with the information that the given table filter and all nested filter can now return rows or not.- Parameters:
filter- the table filterb- the new flag
-
setEvaluatable
public void setEvaluatable(boolean evaluatable)
-
getSchemaName
public java.lang.String getSchemaName()
Description copied from interface:ColumnResolverGet the schema name or null.- Specified by:
getSchemaNamein interfaceColumnResolver- Returns:
- the schema name or null
-
getColumns
public Column[] getColumns()
Description copied from interface:ColumnResolverGet the column list.- Specified by:
getColumnsin interfaceColumnResolver- Returns:
- the column list
-
findColumn
public Column findColumn(java.lang.String name)
Description copied from interface:ColumnResolverGet the column with the specified name.- Specified by:
findColumnin interfaceColumnResolver- Parameters:
name- the column name, must be a derived name if this column resolver has a derived column list- Returns:
- the column with the specified name, or
null
-
getColumnName
public java.lang.String getColumnName(Column column)
Description copied from interface:ColumnResolverGet the name of the specified column.- Specified by:
getColumnNamein interfaceColumnResolver- Parameters:
column- column- Returns:
- column name
-
hasDerivedColumnList
public boolean hasDerivedColumnList()
Description copied from interface:ColumnResolverReturns whether this column resolver has a derived column list.- Specified by:
hasDerivedColumnListin interfaceColumnResolver- Returns:
trueif this column resolver has a derived column list,falseotherwise
-
getColumn
public Column getColumn(java.lang.String columnName, boolean ifExists)
Get the column with the given name.- Parameters:
columnName- the column nameifExists- iftruereturnnullif column does not exist- Returns:
- the column
- Throws:
DbException- if the column was not found andifExistsisfalse
-
getSystemColumns
public Column[] getSystemColumns()
Get the system columns that this table understands. This is used for compatibility with other databases. The columns are only returned if the current mode supports system columns.- Specified by:
getSystemColumnsin interfaceColumnResolver- Returns:
- the system columns
-
getRowIdColumn
public Column getRowIdColumn()
Description copied from interface:ColumnResolverGet the row id pseudo column, if there is one.- Specified by:
getRowIdColumnin interfaceColumnResolver- Returns:
- the row id column or null
-
getValue
public Value getValue(Column column)
Description copied from interface:ColumnResolverGet the value for the given column.- Specified by:
getValuein interfaceColumnResolver- Parameters:
column- the column- Returns:
- the value
-
getTableFilter
public TableFilter getTableFilter()
Description copied from interface:ColumnResolverGet the table filter.- Specified by:
getTableFilterin interfaceColumnResolver- Returns:
- the table filter
-
setAlias
public void setAlias(java.lang.String alias)
-
setDerivedColumns
public void setDerivedColumns(java.util.ArrayList<java.lang.String> derivedColumnNames)
Set derived column list.- Parameters:
derivedColumnNames- names of derived columns
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
addCommonJoinColumns
public void addCommonJoinColumns(Column leftColumn, Column replacementColumn, TableFilter replacementFilter)
Add a column to the common join column list for a left table filter.- Parameters:
leftColumn- the column on the left sidereplacementColumn- the column to use instead, may be the same as column on the left sidereplacementFilter- the table filter for replacement columns
-
addCommonJoinColumnToExclude
public void addCommonJoinColumnToExclude(Column columnToExclude)
Add an excluded column to the common join column list.- Parameters:
columnToExclude- the column to exclude
-
getCommonJoinColumns
public java.util.LinkedHashMap<Column,Column> getCommonJoinColumns()
Returns common join columns map.- Returns:
- common join columns map, or
null
-
getCommonJoinColumnsFilter
public TableFilter getCommonJoinColumnsFilter()
Returns common join columns table filter.- Returns:
- common join columns table filter, or
null
-
isCommonJoinColumnToExclude
public boolean isCommonJoinColumnToExclude(Column c)
Check if the given column is an excluded common join column.- Parameters:
c- the column to check- Returns:
- true if this is an excluded common join column
-
hashCode
public int hashCode()
- Overrides:
hashCodein classjava.lang.Object
-
getNestedJoin
public TableFilter getNestedJoin()
-
visit
public void visit(TableFilter.TableFilterVisitor visitor)
Visit this and all joined or nested table filters.- Parameters:
visitor- the visitor
-
isEvaluatable
public boolean isEvaluatable()
-
getSession
public SessionLocal getSession()
-
getIndexHints
public IndexHints getIndexHints()
-
hasFromClause
public boolean hasFromClause()
Returns whether this is a table filter with implicit DUAL table for a SELECT without a FROM clause.- Returns:
- false if this is a table filter with implicit DUAL table, true otherwise
-
-