/** {@inheritDoc} */ @Override public SqlFieldsQueryEx setEnforceJoinOrder(boolean enforceJoinOrder) { super.setEnforceJoinOrder(enforceJoinOrder); return this; }
/** * Creates SqlFieldsQuery with specified enforce join order flag and specified sql from template. * * @param enforceJoinOrder don't let engine to reorder tables in join. * @param tpl query template in java format. * @param args arguments for the template. */ static SqlFieldsQuery joinQry(boolean enforceJoinOrder, String tpl, Object... args) { return new SqlFieldsQuery(String.format(tpl, args)).setEnforceJoinOrder(enforceJoinOrder); }
/** * @param sql SQL. * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @return Query plan. */ private String plan(String sql, IgniteCache<?, ?> cache, boolean enforceJoinOrder) { return (String)cache.query(new SqlFieldsQuery("explain " + sql) .setDistributedJoins(true) .setEnforceJoinOrder(enforceJoinOrder)) .getAll().get(0).get(0); }
/** * @param cache Cache. * @param sql SQL. * @param enforceJoinOrder Enforce join order flag. */ private void checkQueryFails(final IgniteCache<Object, Object> cache, String sql, boolean enforceJoinOrder) { final SqlFieldsQuery qry = new SqlFieldsQuery(sql); qry.setDistributedJoins(true); qry.setEnforceJoinOrder(enforceJoinOrder); Throwable err = GridTestUtils.assertThrows(log, new Callable<Void>() { @Override public Void call() throws Exception { cache.query(qry); return null; } }, CacheException.class, null); assertTrue("Unexpected error message: " + err.getMessage(), err.getMessage().contains("can not use distributed joins for cache with custom AffinityKeyMapper configured.")); }
qry.setCollocated(collocatedQry); qry.setDistributedJoins(distributedJoins); qry.setEnforceJoinOrder(enforceJoinOrder); qry.setLazy(lazy); qry.setSchema(schemaName);
/** * @param cache Cache. * @param sql SQL. * @param enforceJoinOrder Enforce join order flag. */ private void checkQueryFails(final IgniteCache<Object, Object> cache, String sql, boolean enforceJoinOrder) { final SqlFieldsQuery qry = new SqlFieldsQuery(sql); qry.setDistributedJoins(true); qry.setEnforceJoinOrder(enforceJoinOrder); GridTestUtils.assertThrows(log, new Callable<Void>() { @Override public Void call() throws Exception { cache.query(qry); return null; } }, CacheException.class, null); }
/** */ @Ignore("https://issues.apache.org/jira/browse/IGNITE-10199") @Test public void testMergeJoin() { IgniteCache<Integer, Org> c = ignite(CLIENT).getOrCreateCache(cacheConfig("org", true, Integer.class, Org.class)); try { String qry = "select o1.* from Org o1, " + "(select max(o.name) as name, o.id from Org o group by o.id) o2 " + "where o1.id = o2.id"; List<List<?>> plan = c.query(new SqlFieldsQuery("explain " + qry) .setEnforceJoinOrder(true)).getAll(); X.println("Plan: " + plan); String map0 = (String)plan.get(0).get(0); String map1 = (String)plan.get(1).get(0); String rdc = (String)plan.get(2).get(0); assertTrue(map0.contains("ORDER BY")); assertTrue(map1.contains("ORDER BY")); assertEquals(3, rdc.split("merge_sorted").length); } finally { c.destroy(); } }
/** * @param sql SQL. * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @param expSize Expected results size. */ private void checkQuery(String sql, IgniteCache<Object, Object> cache, boolean enforceJoinOrder, int expSize) { String plan = (String)cache.query(new SqlFieldsQuery("explain " + sql) .setDistributedJoins(true) .setEnforceJoinOrder(enforceJoinOrder)) .getAll().get(0).get(0); log.info("Plan: " + plan); SqlFieldsQuery qry = new SqlFieldsQuery(sql); qry.setDistributedJoins(true); qry.setEnforceJoinOrder(enforceJoinOrder); QueryCursor<List<?>> cur = cache.query(qry); List<List<?>> res = cur.getAll(); if (expSize != res.size()) log.info("Results: " + res); assertEquals(expSize, res.size()); } /**
/** * @param sql SQL. * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @param args Arguments. * @throws Exception If failed. */ private void checkQuery(String sql, IgniteCache<Object, Object> cache, boolean enforceJoinOrder, Object... args) throws Exception { String plan = (String)cache.query(new SqlFieldsQuery("explain " + sql) .setArgs(args) .setDistributedJoins(true) .setEnforceJoinOrder(enforceJoinOrder)) .getAll().get(0).get(0); log.info("Plan: " + plan); compareQueryRes0(cache, sql, true, enforceJoinOrder, args, Ordering.RANDOM); }
/** * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @param expBatchedJoins Expected batched joins count. * @param qry Query. * @param expText Expected text to find in plan. */ private void checkQueryPlan(IgniteCache<Object, Object> cache, boolean enforceJoinOrder, int expBatchedJoins, SqlFieldsQuery qry, String... expText) { qry.setEnforceJoinOrder(enforceJoinOrder); qry.setDistributedJoins(true); String plan = queryPlan(cache, qry); log.info("\n Plan:\n" + plan); assertEquals("Unexpected number of batched joins in plan [plan=" + plan + ", qry=" + qry + ']', expBatchedJoins, StringUtils.countOccurrencesOf(plan, "batched")); int startIdx = 0; for (String exp : expText) { int idx = plan.indexOf(exp, startIdx); if (idx == -1) { fail("Plan does not contain expected string [startIdx=" + startIdx + ", plan=" + plan + ", exp=" + exp + ']'); } startIdx = idx + 1; } }
/** * @param sql SQL. * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @param expSize Expected results size. * @param args Arguments. */ private void checkQuery(String sql, IgniteCache<Object, Object> cache, boolean enforceJoinOrder, int expSize, Object... args) { SqlFieldsQuery qry = new SqlFieldsQuery(sql); qry.setDistributedJoins(true); qry.setEnforceJoinOrder(enforceJoinOrder); qry.setArgs(args); log.info("Plan: " + queryPlan(cache, qry)); QueryCursor<List<?>> cur = cache.query(qry); List<List<?>> res = cur.getAll(); if (expSize != res.size()) log.info("Results: " + res); assertEquals(expSize, res.size()); }
/** * @param sql SQL. * @param cache Cache. * @param enforceJoinOrder Enforce join order flag. * @param expSize Expected results size. * @param args Arguments. * @return Results. */ private List<List<?>> checkQuery(String sql, IgniteCache<Object, Object> cache, boolean enforceJoinOrder, int expSize, Object... args) { SqlFieldsQuery qry = new SqlFieldsQuery(sql); qry.setDistributedJoins(true); qry.setEnforceJoinOrder(enforceJoinOrder); qry.setArgs(args); log.info("Plan: " + queryPlan(cache, qry)); QueryCursor<List<?>> cur = cache.query(qry); List<List<?>> res = cur.getAll(); if (expSize != res.size()) log.info("Results: " + res); assertEquals(expSize, res.size()); return res; }
setArgs(args). setDistributedJoins(distrib). setEnforceJoinOrder(enforceJoinOrder)).getAll();
/** * @param cache Cache. * @param qry Query. * @return Query plan. */ protected final String queryPlan(IgniteCache<?, ?> cache, SqlFieldsQuery qry) { return (String)cache.query(new SqlFieldsQuery("explain " + qry.getSql()) .setArgs(qry.getArgs()) .setLocal(qry.isLocal()) .setCollocated(qry.isCollocated()) .setPageSize(qry.getPageSize()) .setDistributedJoins(qry.isDistributedJoins()) .setEnforceJoinOrder(qry.isEnforceJoinOrder())) .getAll().get(0).get(0); }
.setDistributedJoins(true).setEnforceJoinOrder(true)) .getAll().toString(); .setEnforceJoinOrder(false)).getAll().size()); .setDistributedJoins(true).setEnforceJoinOrder(true)) .getAll().toString(); .setEnforceJoinOrder(false)).getAll().size());
/** * Reads fields query. * * @param reader Binary reader. * @return Query. */ private Query readFieldsQuery(BinaryRawReaderEx reader) { boolean loc = reader.readBoolean(); String sql = reader.readString(); final int pageSize = reader.readInt(); Object[] args = readQueryArgs(reader); boolean distrJoins = reader.readBoolean(); boolean enforceJoinOrder = reader.readBoolean(); boolean lazy = reader.readBoolean(); int timeout = reader.readInt(); boolean replicated = reader.readBoolean(); boolean collocated = reader.readBoolean(); String schema = reader.readString(); return new SqlFieldsQuery(sql) .setPageSize(pageSize) .setArgs(args) .setLocal(loc) .setDistributedJoins(distrJoins) .setEnforceJoinOrder(enforceJoinOrder) .setLazy(lazy) .setTimeout(timeout, TimeUnit.MILLISECONDS) .setReplicatedOnly(replicated) .setCollocated(collocated) .setSchema(schema); }
/** {@inheritDoc} */ @Override public UpdateSourceIterator<?> prepareDistributedUpdate(GridCacheContext<?, ?> cctx, int[] ids, int[] parts, String schema, String qry, Object[] params, int flags, int pageSize, int timeout, AffinityTopologyVersion topVer, MvccSnapshot mvccSnapshot, GridQueryCancel cancel) throws IgniteCheckedException { SqlFieldsQuery fldsQry = new SqlFieldsQuery(qry); if (params != null) fldsQry.setArgs(params); fldsQry.setEnforceJoinOrder(isFlagSet(flags, GridH2QueryRequest.FLAG_ENFORCE_JOIN_ORDER)); fldsQry.setTimeout(timeout, TimeUnit.MILLISECONDS); fldsQry.setPageSize(pageSize); fldsQry.setLocal(true); fldsQry.setDataPageScanEnabled(isDataPageScanEnabled(flags)); boolean loc = true; final boolean replicated = isFlagSet(flags, GridH2QueryRequest.FLAG_REPLICATED); GridCacheContext<?, ?> cctx0; if (!replicated && !F.isEmpty(ids) && (cctx0 = CU.firstPartitioned(cctx.shared(), ids)) != null && cctx0.config().getQueryParallelism() > 1) { fldsQry.setDistributedJoins(true); loc = false; } Connection conn = connMgr.connectionForThread().connection(schema); H2Utils.setupConnection(conn, false, fldsQry.isEnforceJoinOrder()); PreparedStatement stmt = preparedStatementWithParams(conn, fldsQry.getSql(), F.asList(fldsQry.getArgs()), true); return dmlProc.prepareDistributedUpdate(schema, conn, stmt, fldsQry, backupFilter(topVer, parts), cancel, loc, topVer, mvccSnapshot); }
.setLocal(loc) .setReplicatedOnly(replicatedOnly) .setEnforceJoinOrder(enforceJoinOrder) .setCollocated(collocated) .setLazy(lazy)
.setEnforceJoinOrder(true)).getAll(); .setEnforceJoinOrder(true)).getAll());
.setEnforceJoinOrder(true)).getAll(); .setEnforceJoinOrder(true)).getAll());