@Override public Integer getLimit() { return delegate.getLimit(); }
@Test public void testNegativeBoundLimit() throws SQLException { String query = "select * from atable limit ?"; List<Object> binds = Arrays.<Object>asList(-1); QueryPlan plan = compileStatement(query, binds); assertNull(plan.getLimit()); }
/** * The method validates the statement passed to the query plan. List of conditions are * <ol> * <li>Is a SELECT statement</li> * <li>doesn't contain ORDER BY expression</li> * <li>doesn't contain LIMIT</li> * <li>doesn't contain GROUP BY expression</li> * <li>doesn't contain DISTINCT</li> * <li>doesn't contain AGGREGATE functions</li> * </ol> * @param queryPlan * @return */ private boolean isValidStatement(final QueryPlan queryPlan) { if(queryPlan.getStatement().getOperation() != PhoenixStatement.Operation.QUERY) { throw new IllegalArgumentException("Query passed isn't a SELECT statement"); } if(!queryPlan.getOrderBy().getOrderByExpressions().isEmpty() || queryPlan.getLimit() != null || (queryPlan.getGroupBy() != null && !queryPlan.getGroupBy().isEmpty()) || queryPlan.getStatement().isDistinct() || queryPlan.getStatement().isAggregate()) { throw new IllegalArgumentException("SELECT statement shouldn't contain DISTINCT or ORDER BY or LIMIT or GROUP BY expressions"); } return true; }
private static QueryPlan compileStatement(String query, List<Object> binds, Integer limit) throws SQLException { PhoenixConnection pconn = DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)).unwrap(PhoenixConnection.class); PhoenixPreparedStatement pstmt = new PhoenixPreparedStatement(pconn, query); TestUtil.bindParams(pstmt, binds); QueryPlan plan = pstmt.compileQuery(); assertEquals(limit, plan.getLimit()); return plan; }
public BaseResultIterators(QueryPlan plan, Integer perScanLimit, Integer offset, ParallelScanGrouper scanGrouper, Scan scan, Map<ImmutableBytesPtr,ServerCache> caches, QueryPlan dataPlan) throws SQLException { super(plan.getContext(), plan.getTableRef(), plan.getGroupBy(), plan.getOrderBy(), plan.getStatement().getHint(), QueryUtil.getOffsetLimit(plan.getLimit(), plan.getOffset()), offset); this.plan = plan; this.scan = scan;
private static StatementContext compileStatement(String query, List<Object> binds, Integer limit) throws SQLException { PhoenixConnection pconn = DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)).unwrap(PhoenixConnection.class); PhoenixPreparedStatement pstmt = new PhoenixPreparedStatement(pconn, query); assertRoundtrip(query); TestUtil.bindParams(pstmt, binds); QueryPlan plan = pstmt.compileQuery(); assertEquals(limit, plan.getLimit()); return plan.getContext(); }
@Override public Integer getLimit() { return delegate.getLimit(); }
@Override public Integer getLimit() { return delegate.getLimit(); }
public QueryPlan compileUnionAll(SelectStatement select) throws SQLException { List<SelectStatement> unionAllSelects = select.getSelects(); List<QueryPlan> plans = new ArrayList<QueryPlan>(); for (int i=0; i < unionAllSelects.size(); i++ ) { SelectStatement subSelect = unionAllSelects.get(i); // Push down order-by and limit into sub-selects. if (!select.getOrderBy().isEmpty() || select.getLimit() != null) { if (select.getOffset() == null) { subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), select.getLimit(), null); } else { subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), null, null); } } QueryPlan subPlan = compileSubquery(subSelect, true); plans.add(subPlan); } TableRef tableRef = UnionCompiler.contructSchemaTable(statement, plans, select.hasWildcard() ? null : select.getSelect()); ColumnResolver resolver = FromCompiler.getResolver(tableRef); StatementContext context = new StatementContext(statement, resolver, scan, sequenceManager); QueryPlan plan = compileSingleFlatQuery(context, select, statement.getParameters(), false, false, null, null, false); plan = new UnionPlan(context, select, tableRef, plan.getProjector(), plan.getLimit(), plan.getOffset(), plan.getOrderBy(), GroupBy.EMPTY_GROUP_BY, plans, context.getBindManager().getParameterMetaData()); return plan; }
@Override public Double visit(HashJoinPlan plan) { try { QueryPlan lhsPlan = plan.getDelegate(); Long b = lhsPlan.getEstimatedRowsToScan(); if (b == null) { return null; } Double rows = filter(b.doubleValue(), stripSkipScanFilter(lhsPlan.getContext().getScan().getFilter())); JoinTableNode.JoinType[] joinTypes = plan.getJoinInfo().getJoinTypes(); HashJoinPlan.SubPlan[] subPlans = plan.getSubPlans(); for (int i = 0; i < joinTypes.length; i++) { Double rhsRows = subPlans[i].getInnerPlan().accept(this); if (rhsRows == null) { return null; } rows = join(rows, rhsRows.doubleValue(), joinTypes[i]); } if (lhsPlan instanceof AggregatePlan) { AggregatePlan aggPlan = (AggregatePlan) lhsPlan; rows = filter(aggregate(rows, aggPlan.getGroupBy()), aggPlan.getHaving()); } return limit(rows, lhsPlan.getLimit()); } catch (SQLException e) { } return null; }
@Test public void testBoundLimit() throws SQLException { String tenantId = "000000000000001"; String query = "select * from atable where organization_id='" + tenantId + "' limit ?"; List<Object> binds = Arrays.<Object>asList(5); QueryPlan plan = compileStatement(query, binds); Scan scan = plan.getContext().getScan(); assertNull(scan.getFilter()); assertArrayEquals(PVarchar.INSTANCE.toBytes(tenantId), scan.getStartRow()); assertArrayEquals(ByteUtil.nextKey(PVarchar.INSTANCE.toBytes(tenantId)), scan.getStopRow()); assertEquals(plan.getLimit(),Integer.valueOf(5)); }
@Test public void testLimit() throws SQLException { String tenantId = "000000000000001"; String query = "select * from atable where organization_id='" + tenantId + "' limit 5"; List<Object> binds = Collections.emptyList(); QueryPlan plan = compileStatement(query, binds); Scan scan = plan.getContext().getScan(); assertNull(scan.getFilter()); assertArrayEquals(PVarchar.INSTANCE.toBytes(tenantId), scan.getStartRow()); assertArrayEquals(ByteUtil.nextKey(PVarchar.INSTANCE.toBytes(tenantId)), scan.getStopRow()); assertEquals(plan.getLimit(),Integer.valueOf(5)); }
@Test public void testNoLimit() throws SQLException { String tenantId = "000000000000001"; String query = "select * from atable where organization_id='" + tenantId + "'"; List<Object> binds = Collections.emptyList(); QueryPlan plan = compileStatement(query, binds); Scan scan = plan.getContext().getScan(); assertNull(scan.getFilter()); assertNull(plan.getLimit()); assertArrayEquals(PVarchar.INSTANCE.toBytes(tenantId), scan.getStartRow()); assertArrayEquals(ByteUtil.nextKey(PVarchar.INSTANCE.toBytes(tenantId)), scan.getStopRow()); }
Integer offset = null; if (!query.isAggregate() && !query.isDistinct() && query.getOrderBy().isEmpty()) { limit = plan.getLimit(); offset = plan.getOffset(); Integer offset = null; if (!rhs.isAggregate() && !rhs.isDistinct() && rhs.getOrderBy().isEmpty()) { limit = rhsPlan.getLimit(); offset = rhsPlan.getOffset();
bytes = bytesAfterHaving; double outputRows = RowCountVisitor.limit(rows, delegate.getLimit()); double outputBytes = rowWidth * outputRows; if (!delegate.getOrderBy().getOrderByExpressions().isEmpty()) {
public QueryPlan compileUnionAll(SelectStatement select) throws SQLException { List<SelectStatement> unionAllSelects = select.getSelects(); List<QueryPlan> plans = new ArrayList<QueryPlan>(); for (int i=0; i < unionAllSelects.size(); i++ ) { SelectStatement subSelect = unionAllSelects.get(i); // Push down order-by and limit into sub-selects. if (!select.getOrderBy().isEmpty() || select.getLimit() != null) { if (select.getOffset() == null) { subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), select.getLimit(), null); } else { subSelect = NODE_FACTORY.select(subSelect, select.getOrderBy(), null, null); } } QueryPlan subPlan = compileSubquery(subSelect, true); plans.add(subPlan); } TableRef tableRef = UnionCompiler.contructSchemaTable(statement, plans, select.hasWildcard() ? null : select.getSelect()); ColumnResolver resolver = FromCompiler.getResolver(tableRef); StatementContext context = new StatementContext(statement, resolver, scan, sequenceManager); QueryPlan plan = compileSingleFlatQuery(context, select, statement.getParameters(), false, false, null, null, false); plan = new UnionPlan(context, select, tableRef, plan.getProjector(), plan.getLimit(), plan.getOffset(), plan.getOrderBy(), GroupBy.EMPTY_GROUP_BY, plans, context.getBindManager().getParameterMetaData()); return plan; }