@Override public CompiledQuery compile(RawQuery query) throws QueryCompileException { return new CompiledQuery(query); } }
@Override public ModifyResult<String> delete(CompiledQuery query, EntityDefinition entityDefinition) throws IOException { if (query.isHasAgg()) { throw new IOException("delete by aggregation query is not supported"); LOG.info("Querying for deleting: " + query); GenericQuery reader = GenericQueryBuilder .select(query.getSearchCondition().getOutputFields()) .from(query.getServiceName(), query.getRawQuery().getMetricName()).where(query.getSearchCondition()) .groupBy(query.isHasAgg(), query.getGroupByFields(), query.getAggregateFunctionTypes(), query.getAggregateFields()) .timeSeries(query.getRawQuery().isTimeSeries(), query.getRawQuery().getIntervalmin()) .treeAgg(query.getRawQuery().isTreeAgg()) .orderBy(query.getSortOptions(), query.getSortFunctions(), query.getSortFields()) .top(query.getRawQuery().getTop()) .parallel(query.getRawQuery().getParallel()) .build(); List<? extends TaggedLogAPIEntity> entities = reader.result();
private <E> Map timeseriesAggregate(List<E> result, CompiledQuery query) throws Exception { TimeSeriesAggregator aggregator = new TimeSeriesAggregator(query.getGroupByFields(), query.getAggregateFunctionTypes(), query.getAggregateFields(), query.getStartTime(), query.getEndTime(), query.getIntervalMin() ); for(E entity: result) aggregator.accumulate((TaggedLogAPIEntity) entity); if(this.jdbcEntityDefinition.isGenericMetric()) { return aggregator.getMetric(); } else { return aggregator.result(); } }
if(query.isHasAgg() && !query.isTimeSeries()) { recordMapper = (RecordMapper<E>) new AggreagteRecordMapper(query, jdbcEntityDefinition); }else{ result = peer.delegate().doSelect(criteria, recordMapper); LOG.info(String.format("Read %s records in %s ms (sql: %s)",result.size(),stopWatch.getTime(),displaySql)); if(result.size() > 0 && query.isTimeSeries()){ result = Lists.newArrayList((E) timeseriesAggregate(result, query));
@Override public Criteria build() { Criteria root = new Criteria(); SearchCondition searchCondition = query.getSearchCondition(); if(query.isHasAgg()){ if(this.jdbcEntityDefinition.getInternal().isTimeSeries() && query.isTimeSeries()) { List<String> aggFields = query.getAggregateFields(); for(String field:aggFields){ root.addSelectColumn(new ColumnImpl(this.tableName,field)); List<String> groupByFieldsFields = query.getGroupByFields(); for(String field:groupByFieldsFields){ root.addSelectColumn(new ColumnImpl(this.tableName,field)); List<String> aggFields = query.getAggregateFields(); List<AggregateFunctionType> aggFuncs = query.getAggregateFunctionTypes(); for (int i = 0; i < aggFuncs.size(); i++) { AggregateFunctionType aggFunc = aggFuncs.get(i); Criterion where = new Criterion(new ColumnImpl(this.tableName, JdbcConstants.TIMESTAMP_COLUMN_NAME), query.getStartTime(), SqlEnum.GREATER_EQUAL) .and(new Criterion(new ColumnImpl(this.tableName, JdbcConstants.TIMESTAMP_COLUMN_NAME),query.getEndTime(), SqlEnum.LESS_THAN)); ORExpression expression = searchCondition.getQueryExpression(); if(expression!=null){ if(query.getServiceName().equals(GenericMetricEntity.GENERIC_METRIC_SERVICE)){ where = where.and(new Criterion(new ColumnImpl(this.tableName, JdbcConstants.METRIC_NAME_COLUMN_NAME),this.query.getRawQuery().getMetricName(),SqlEnum.EQUAL)); if(query.isHasAgg() && !query.isTimeSeries()){
@Test public void testCreatedCompiledQuery() throws QueryCompileException, IOException { RawQuery rawQuery = new RawQuery(); rawQuery.setQuery(queryStr); rawQuery.setStartTime(startTime); rawQuery.setEndTime(endTime); rawQuery.setPageSize(pageSize); CompiledQuery query = new CompiledQuery(rawQuery); Assert.assertEquals(baseTimestamp, query.getStartTime()); Assert.assertEquals(baseTimestamp + 2000, query.getEndTime()); Assert.assertEquals(rawQuery.isTreeAgg(), query.isHasAgg()); Assert.assertEquals(rawQuery.isTimeSeries(), query.isTimeSeries()); RawQuery raw2 = RawQuery.build().query(queryStr).startTime(startTime) .endTime(endTime).pageSize(pageSize).done(); Assert.assertEquals(rawQuery.toString(), raw2.toString()); } }
@Override public QueryResult<?> execute(DataStorage dataStorage) throws IOException { CompiledQuery compiledQuery; try { compiledQuery = dataStorage.compile(this.query); } catch (QueryCompileException e) { throw new IOException(e); } try { EntityDefinition entityDefinition = EntityDefinitionManager.getEntityByServiceName(compiledQuery.getServiceName()); return dataStorage.query(compiledQuery, entityDefinition); } catch (InstantiationException | IllegalAccessException e) { throw new IOException(e); } } }
protected void compile() throws Exception { validateQueryParameters(this.getRawQuery().getStartRowkey(),this.getRawQuery().getPageSize()); checkNotNull(this.rawQuery,"rawQuery instance"); checkNotNull(this.rawQuery.getQuery(),"query"); this.groupByFields = compiler.groupbyFields(); this.aggregateFields = compiler.aggregateFields(); this.timeSeries = this.getRawQuery().isTimeSeries(); this.setStartTime(startTimeMills); this.setEndTime(endTimeMillis); } else { this.searchCondition.setStartTime(0); this.searchCondition.setEndTime(1); this.setStartTime(0); this.setEndTime(1);
@Override @SuppressWarnings("unchecked") public <E extends Object> QueryResult<E> query(CompiledQuery query, EntityDefinition entityDefinition) throws IOException { QueryResult<E> result = new QueryResult<E>(); try { JdbcEntityDefinition jdbcEntityDefinition = JdbcEntityDefinitionManager.getJdbcEntityDefinition(entityDefinition); JdbcEntityReader reader = new JdbcEntityReaderImpl(jdbcEntityDefinition); List<E> entities = reader.query(query); result.setData(entities); if(entities!=null) { result.setSize(entities.size()); }else{ result.setSize(0); } if(query.isHasAgg()){ result.setEntityType((Class<E>) Map.class); }else { result.setEntityType((Class<E>) entityDefinition.getEntityClass()); } result.setFirstTimestamp(reader.getResultFirstTimestamp()); result.setLastTimestamp(reader.getResultLastTimestamp()); result.setSuccess(true); } catch (Exception e) { LOG.error(e.getMessage(), e); result.setSuccess(false); throw new IOException(e.getCause()); } return result; }
public long getIntervalMin() { return this.getRawQuery().getIntervalmin(); } }
@Override public Criteria build() { Criteria root = new Criteria(); SearchCondition searchCondition = query.getSearchCondition(); if(query.isHasAgg()){ if(this.jdbcEntityDefinition.getInternal().isTimeSeries() && query.isTimeSeries()) { List<String> aggFields = query.getAggregateFields(); for(String field:aggFields){ root.addSelectColumn(new ColumnImpl(this.tableName,field)); List<String> groupByFieldsFields = query.getGroupByFields(); for(String field:groupByFieldsFields){ root.addSelectColumn(new ColumnImpl(this.tableName,field)); List<String> aggFields = query.getAggregateFields(); List<AggregateFunctionType> aggFuncs = query.getAggregateFunctionTypes(); for (int i = 0; i < aggFuncs.size(); i++) { AggregateFunctionType aggFunc = aggFuncs.get(i); Criterion where = new Criterion(new ColumnImpl(this.tableName, JdbcConstants.TIMESTAMP_COLUMN_NAME), query.getStartTime(), SqlEnum.GREATER_EQUAL) .and(new Criterion(new ColumnImpl(this.tableName, JdbcConstants.TIMESTAMP_COLUMN_NAME),query.getEndTime(), SqlEnum.LESS_THAN)); ORExpression expression = searchCondition.getQueryExpression(); if(expression!=null){ if(query.getServiceName().equals(GenericMetricEntity.GENERIC_METRIC_SERVICE)){ where = where.and(new Criterion(new ColumnImpl(this.tableName, JdbcConstants.METRIC_NAME_COLUMN_NAME),this.query.getRawQuery().getMetricName(),SqlEnum.EQUAL)); if(query.isHasAgg() && !query.isTimeSeries()){
@SuppressWarnings("unchecked") @Override public ModifyResult<String> execute(DataStorage storage) throws IOException { ModifyResult result; try { if (this.ids != null) { result = storage.deleteByID(this.ids,this.entityDefinition); } else if (this.entities != null) { result = storage.delete(this.entities, this.entityDefinition); } else if (this.query != null) { CompiledQuery compiledQuery = storage.compile(this.query); this.entityDefinition = EntityDefinitionManager.getEntityByServiceName(compiledQuery.getServiceName()); result = storage.delete(compiledQuery,this.entityDefinition); } else { throw new IllegalStateException("bad delete statement, not given enough parameters"); } } catch (QueryCompileException e) { throw new IOException(e); } catch (Exception ex) { throw new IOException(ex); } return result; } }
if(query.isHasAgg() && !query.isTimeSeries()) { recordMapper = (RecordMapper<E>) new AggreagteRecordMapper(query, jdbcEntityDefinition); }else{ result = peer.delegate().doSelect(criteria, recordMapper); LOG.info(String.format("Read %s records in %s ms (sql: %s)",result.size(),stopWatch.getTime(),displaySql)); if(result.size() > 0 && query.isTimeSeries()){ result = Lists.newArrayList((E) timeseriesAggregate(result, query));
@Override @SuppressWarnings("unchecked") public <E extends Object> QueryResult<E> query(CompiledQuery query, EntityDefinition entityDefinition) throws IOException { QueryResult<E> result = new QueryResult<E>(); try { JdbcEntityDefinition jdbcEntityDefinition = JdbcEntityDefinitionManager.getJdbcEntityDefinition(entityDefinition); JdbcEntityReader reader = new JdbcEntityReaderImpl(jdbcEntityDefinition); List<E> entities = reader.query(query); result.setData(entities); if(entities!=null) { result.setSize(entities.size()); }else{ result.setSize(0); } if(query.isHasAgg()){ result.setEntityType((Class<E>) Map.class); }else { result.setEntityType((Class<E>) entityDefinition.getEntityClass()); } result.setFirstTimestamp(reader.getResultFirstTimestamp()); result.setLastTimestamp(reader.getResultLastTimestamp()); result.setSuccess(true); } catch (Exception e) { LOG.error(e.getMessage(), e); result.setSuccess(false); throw new IOException(e.getCause()); } return result; }
if(query.isHasAgg()){ throw new IOException("delete by aggregation query is not supported"); LOG.info("Querying for deleting: "+query); GenericQuery reader = GenericQueryBuilder .select(query.getSearchCondition().getOutputFields()) .from(query.getServiceName(),query.getRawQuery().getMetricName()).where(query.getSearchCondition()) .groupBy(query.isHasAgg(), query.getGroupByFields(), query.getAggregateFunctionTypes(), query.getAggregateFields()) .timeSeries(query.getRawQuery().isTimeSeries(),query.getRawQuery().getIntervalmin()) .treeAgg(query.getRawQuery().isTreeAgg()) .orderBy(query.getSortOptions(),query.getSortFunctions(),query.getSortFields()) .top(query.getRawQuery().getTop()) .parallel(query.getRawQuery().getParallel()) .build(); List<? extends TaggedLogAPIEntity> entities = reader.result();
public void testSimpleQueryBuilder2() throws QueryCompileException { RawQuery rawQuery = new RawQuery(); rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster=\"thecluster\" AND @field4 > 1000 OR @field5 < 10000 ]{@field1,@field2, EXP{@field3/2}}"); rawQuery.setStartTime("2015-01-06 01:40:02"); rawQuery.setEndTime("2015-01-06 01:40:02"); rawQuery.setPageSize(1000); CompiledQuery query = new CompiledQuery(rawQuery); QueryCriteriaBuilder criteriaBuilder = new QueryCriteriaBuilder(query,jdbcEntityDefinition); Criteria criteria = criteriaBuilder.build(); LOG.info(criteria.toString()); }
private <E> Map timeseriesAggregate(List<E> result, CompiledQuery query) throws Exception { TimeSeriesAggregator aggregator = new TimeSeriesAggregator(query.getGroupByFields(), query.getAggregateFunctionTypes(), query.getAggregateFields(), query.getStartTime(), query.getEndTime(), query.getIntervalMin() ); for(E entity: result) aggregator.accumulate((TaggedLogAPIEntity) entity); if(this.jdbcEntityDefinition.isGenericMetric()) { return aggregator.getMetric(); } else { return aggregator.result(); } }
@Test public void testQueryExecute() throws Exception { RawQuery query = mock(RawQuery.class); CompiledQuery compiledQuery = mock(CompiledQuery.class); QueryStatement queryStatement = new QueryStatement(query); when(mockDataStorage.compile(query)).thenReturn(compiledQuery); when(compiledQuery.getServiceName()).thenReturn("TestTimeSeriesAPIEntity"); queryStatement.execute(mockDataStorage); verify(mockDataStorage).query(any(), any()); } }
try { GenericQuery reader = GenericQueryBuilder .select(query.getSearchCondition().getOutputFields()) .from(query.getServiceName(), query.getRawQuery().getMetricName()).where(query.getSearchCondition()) .groupBy(query.isHasAgg(), query.getGroupByFields(), query.getAggregateFunctionTypes(), query.getAggregateFields()) .timeSeries(query.getRawQuery().isTimeSeries(), query.getRawQuery().getIntervalmin()) .treeAgg(query.getRawQuery().isTreeAgg()) .orderBy(query.getSortOptions(), query.getSortFunctions(), query.getSortFields()) .top(query.getRawQuery().getTop()) .parallel(query.getRawQuery().getParallel()) .build(); List<E> entities = reader.result(); result.setLastTimestamp(reader.getLastTimestamp()); result.setSize(entities.size()); if (!query.isHasAgg()) { result.setEntityType((Class<E>) entityDefinition.getEntityClass()); } else {
@Test public void testSimpleQueryBuilder() throws QueryCompileException { RawQuery rawQuery = new RawQuery(); rawQuery.setQuery("TestTimeSeriesAPIEntity[@cluster=\"thecluster\" AND @field4 > 1000 ]{@field1,@field2, EXP{@field3/2}}"); rawQuery.setStartTime("2015-01-06 01:40:02"); rawQuery.setEndTime("2015-01-06 01:40:02"); rawQuery.setPageSize(1000); CompiledQuery query = new CompiledQuery(rawQuery); QueryCriteriaBuilder criteriaBuilder = new QueryCriteriaBuilder(query,jdbcEntityDefinition); Criteria criteria = criteriaBuilder.build(); LOG.info(criteria.toString()); }