Search in sources :

Example 11 with SortOrder

use of org.h2.result.SortOrder in project h2database by h2database.

the class ViewIndex method getQuery.

private Query getQuery(Session session, int[] masks, TableFilter[] filters, int filter, SortOrder sortOrder) {
    Query q = prepareSubQuery(querySQL, session, masks, filters, filter, sortOrder);
    if (masks == null) {
        return q;
    }
    if (!q.allowGlobalConditions()) {
        return q;
    }
    int firstIndexParam = view.getParameterOffset(originalParameters);
    // the column index of each parameter
    // (for example: paramColumnIndex {0, 0} mean
    // param[0] is column 0, and param[1] is also column 0)
    IntArray paramColumnIndex = new IntArray();
    int indexColumnCount = 0;
    for (int i = 0; i < masks.length; i++) {
        int mask = masks[i];
        if (mask == 0) {
            continue;
        }
        indexColumnCount++;
        // the number of parameters depends on the mask;
        // for range queries it is 2: >= x AND <= y
        // but bitMask could also be 7 (=, and <=, and >=)
        int bitCount = Integer.bitCount(mask);
        for (int j = 0; j < bitCount; j++) {
            paramColumnIndex.add(i);
        }
    }
    int len = paramColumnIndex.size();
    ArrayList<Column> columnList = New.arrayList();
    for (int i = 0; i < len; ) {
        int idx = paramColumnIndex.get(i);
        columnList.add(table.getColumn(idx));
        int mask = masks[idx];
        if ((mask & IndexCondition.EQUALITY) != 0) {
            Parameter param = new Parameter(firstIndexParam + i);
            q.addGlobalCondition(param, idx, Comparison.EQUAL_NULL_SAFE);
            i++;
        }
        if ((mask & IndexCondition.START) != 0) {
            Parameter param = new Parameter(firstIndexParam + i);
            q.addGlobalCondition(param, idx, Comparison.BIGGER_EQUAL);
            i++;
        }
        if ((mask & IndexCondition.END) != 0) {
            Parameter param = new Parameter(firstIndexParam + i);
            q.addGlobalCondition(param, idx, Comparison.SMALLER_EQUAL);
            i++;
        }
        if ((mask & IndexCondition.SPATIAL_INTERSECTS) != 0) {
            Parameter param = new Parameter(firstIndexParam + i);
            q.addGlobalCondition(param, idx, Comparison.SPATIAL_INTERSECTS);
            i++;
        }
    }
    columns = columnList.toArray(new Column[0]);
    // reconstruct the index columns from the masks
    this.indexColumns = new IndexColumn[indexColumnCount];
    this.columnIds = new int[indexColumnCount];
    for (int type = 0, indexColumnId = 0; type < 2; type++) {
        for (int i = 0; i < masks.length; i++) {
            int mask = masks[i];
            if (mask == 0) {
                continue;
            }
            if (type == 0) {
                if ((mask & IndexCondition.EQUALITY) == 0) {
                    // the first columns need to be equality conditions
                    continue;
                }
            } else {
                if ((mask & IndexCondition.EQUALITY) != 0) {
                    // after that only range conditions
                    continue;
                }
            }
            IndexColumn c = new IndexColumn();
            c.column = table.getColumn(i);
            indexColumns[indexColumnId] = c;
            columnIds[indexColumnId] = c.column.getColumnId();
            indexColumnId++;
        }
    }
    String sql = q.getPlanSQL();
    q = prepareSubQuery(sql, session, masks, filters, filter, sortOrder);
    return q;
}
Also used : Query(org.h2.command.dml.Query) IntArray(org.h2.util.IntArray) Column(org.h2.table.Column) IndexColumn(org.h2.table.IndexColumn) Parameter(org.h2.expression.Parameter) IndexColumn(org.h2.table.IndexColumn)

Example 12 with SortOrder

use of org.h2.result.SortOrder in project h2database by h2database.

the class ViewIndex method prepareSubQuery.

private static Query prepareSubQuery(String sql, Session session, int[] masks, TableFilter[] filters, int filter, SortOrder sortOrder) {
    Prepared p;
    session.pushSubQueryInfo(masks, filters, filter, sortOrder);
    try {
        p = session.prepare(sql, true, true);
    } finally {
        session.popSubQueryInfo();
    }
    return (Query) p;
}
Also used : Query(org.h2.command.dml.Query) Prepared(org.h2.command.Prepared)

Example 13 with SortOrder

use of org.h2.result.SortOrder in project h2database by h2database.

the class NonUniqueHashIndex method getCost.

@Override
public double getCost(Session session, int[] masks, TableFilter[] filters, int filter, SortOrder sortOrder, HashSet<Column> allColumnsSet) {
    for (Column column : columns) {
        int index = column.getColumnId();
        int mask = masks[index];
        if ((mask & IndexCondition.EQUALITY) != IndexCondition.EQUALITY) {
            return Long.MAX_VALUE;
        }
    }
    return 2;
}
Also used : Column(org.h2.table.Column) IndexColumn(org.h2.table.IndexColumn)

Aggregations

IndexColumn (org.h2.table.IndexColumn)5 SortOrder (org.h2.result.SortOrder)4 Column (org.h2.table.Column)4 Query (org.h2.command.dml.Query)2 Value (org.h2.value.Value)2 Prepared (org.h2.command.Prepared)1 AlterTableAddConstraint (org.h2.command.ddl.AlterTableAddConstraint)1 SelectOrderBy (org.h2.command.dml.SelectOrderBy)1 Constraint (org.h2.constraint.Constraint)1 Database (org.h2.engine.Database)1 DbObject (org.h2.engine.DbObject)1 Expression (org.h2.expression.Expression)1 Parameter (org.h2.expression.Parameter)1 ValueExpression (org.h2.expression.ValueExpression)1 Index (org.h2.index.Index)1 IndexCondition (org.h2.index.IndexCondition)1 ViewIndex (org.h2.index.ViewIndex)1 Trace (org.h2.message.Trace)1 TableFilter (org.h2.table.TableFilter)1 IntArray (org.h2.util.IntArray)1