/** Handle SQL query. */ private QueryCursor<Cache.Entry<K, V>> sqlQuery(SqlQuery qry) { Consumer<BinaryOutputStream> qryWriter = out -> { writeCacheInfo(out); serDes.writeObject(out, qry.getType()); serDes.writeObject(out, qry.getSql()); ClientUtils.collection(qry.getArgs(), out, serDes::writeObject); out.writeBoolean(qry.isDistributedJoins()); out.writeBoolean(qry.isLocal()); out.writeBoolean(qry.isReplicatedOnly()); out.writeInt(qry.getPageSize()); out.writeLong(qry.getTimeout()); }; return new ClientQueryCursor<>(new ClientQueryPager<>( ch, ClientOperation.QUERY_SQL, ClientOperation.QUERY_SQL_CURSOR_GET_PAGE, qryWriter, keepBinary, marsh )); }
/** {@inheritDoc} */ @SuppressWarnings("deprecation") @Override public SqlFieldsQuery generateFieldsQuery(String cacheName, SqlQuery qry) { String schemaName = schema(cacheName); String type = qry.getType(); H2TableDescriptor tblDesc = schemaMgr.tableForType(schemaName, cacheName, type); if (tblDesc == null) throw new IgniteSQLException("Failed to find SQL table for type: " + type, IgniteQueryErrorCode.TABLE_NOT_FOUND); String sql; try { sql = H2Utils.generateFieldsQueryString(qry.getSql(), qry.getAlias(), tblDesc); } catch (IgniteCheckedException e) { throw new IgniteException(e); } SqlFieldsQuery res = new SqlFieldsQuery(sql); res.setArgs(qry.getArgs()); res.setDistributedJoins(qry.isDistributedJoins()); res.setLocal(qry.isLocal()); res.setPageSize(qry.getPageSize()); res.setPartitions(qry.getPartitions()); res.setReplicatedOnly(qry.isReplicatedOnly()); res.setSchema(schemaName); res.setSql(sql); res.setDataPageScanEnabled(qry.isDataPageScanEnabled()); if (qry.getTimeout() > 0) res.setTimeout(qry.getTimeout(), TimeUnit.MILLISECONDS); return res; }
/** * Validate SQL query. * * @param qry Query. * @param ctx Kernal context. * @param cctx Cache context. */ private static void validateSqlQuery(SqlQuery qry, GridKernalContext ctx, GridCacheContext<?, ?> cctx) { if (qry.isLocal() && ctx.clientNode() && cctx.config().getCacheMode() != CacheMode.LOCAL) throw new CacheException("Execution of local SqlQuery on client node disallowed."); }
/** * Execute distributed SQL query. * * @param cctx Cache context. * @param qry Query. * @param keepBinary Keep binary flag. * @return Cursor. */ public <K, V> QueryCursor<Cache.Entry<K,V>> querySql(final GridCacheContext<?,?> cctx, final SqlQuery qry, boolean keepBinary) { validateSqlQuery(qry, ctx, cctx); if (qry.isReplicatedOnly() && qry.getPartitions() != null) throw new CacheException("Partitions are not supported in replicated only mode."); if (qry.isDistributedJoins() && qry.getPartitions() != null) throw new CacheException( "Using both partitions and distributed JOINs is not supported for the same query"); if ((qry.isReplicatedOnly() && cctx.isReplicatedAffinityNode()) || cctx.isLocal() || qry.isLocal()) return queryLocalSql(cctx, qry, keepBinary); return queryDistributedSql(cctx, qry, keepBinary); }
fqry.setDistributedJoins(qry.isDistributedJoins()); fqry.setPartitions(qry.getPartitions()); fqry.setLocal(qry.isLocal());
/** Handle SQL query. */ private QueryCursor<Cache.Entry<K, V>> sqlQuery(SqlQuery qry) { Consumer<BinaryOutputStream> qryWriter = out -> { writeCacheInfo(out); serDes.writeObject(out, qry.getType()); serDes.writeObject(out, qry.getSql()); ClientUtils.collection(qry.getArgs(), out, serDes::writeObject); out.writeBoolean(qry.isDistributedJoins()); out.writeBoolean(qry.isLocal()); out.writeBoolean(qry.isReplicatedOnly()); out.writeInt(qry.getPageSize()); out.writeLong(qry.getTimeout()); }; return new ClientQueryCursor<>(new ClientQueryPager<>( ch, ClientOperation.QUERY_SQL, ClientOperation.QUERY_SQL_CURSOR_GET_PAGE, qryWriter, keepBinary, marsh )); }