/** * @param functionNames: accurate function comes first * @param testColumns * @param groupByColumn * @param precision * @throws Exception */ private void testApproximationQuery( String[] functionNames, String[] testColumns, String groupByColumn, double precision) throws Exception { String query; boolean hasWhere = true; LOGGER.debug( "========================== Test Total " + testColumns.length * 2 + " Queries =========================="); for (String column : testColumns) { for (int i = 0; i < 2; i++) { query = "select " + functionNames[0] + "(" + column + ") from 'mytable'"; if (hasWhere) { query += " where DaysSinceEpoch >= 16312"; } if (groupByColumn != null) { query += " group by " + groupByColumn; JSONArray accurate = getGroupByArrayFromJSONAggregationResults(postQuery(query)); query = query.replace(functionNames[0], functionNames[1]); JSONArray estimate = getGroupByArrayFromJSONAggregationResults(postQuery(query)); TestUtils.assertJSONArrayApproximation(estimate, accurate, precision); } else { double accurate = Double.parseDouble(getSingleStringValueFromJSONAggregationResults(postQuery(query))); query = query.replace(functionNames[0], functionNames[1]); double estimate = Double.parseDouble(getSingleStringValueFromJSONAggregationResults(postQuery(query))); TestUtils.assertApproximation(estimate, accurate, precision); // } LOGGER.debug("========================== End =========================="); hasWhere = !hasWhere; } } }
private void runApproximationQueries( List<? extends AvroQueryGenerator.TestAggreationQuery> queries, double precision) throws Exception { boolean isAccurate = true; Object accurateValue = null; int counter = 0; final Map<ServerInstance, DataTable> instanceResponseMap = new HashMap<ServerInstance, DataTable>(); for (final AvroQueryGenerator.TestAggreationQuery query : queries) { LOGGER.info("**************************"); LOGGER.info("running " + counter + " : " + query.getPql()); final BrokerRequest brokerRequest = RequestConverter.fromJSON(REQUEST_COMPILER.compile(query.getPql())); InstanceRequest instanceRequest = new InstanceRequest(counter++, brokerRequest); instanceRequest.setSearchSegments(new ArrayList<String>()); instanceRequest.getSearchSegments().add(segmentName); final DataTable instanceResponse = QUERY_EXECUTOR.processQuery(instanceRequest); instanceResponseMap.clear(); instanceResponseMap.put(new ServerInstance("localhost:0000"), instanceResponse); final BrokerResponse brokerResponse = REDUCE_SERVICE.reduceOnDataTable(brokerRequest, instanceResponseMap); LOGGER.info("BrokerResponse is " + brokerResponse.getAggregationResults().get(0)); // compute value Object val; if (query instanceof AvroQueryGenerator.TestSimpleAggreationQuery) { val = Double.parseDouble(brokerResponse.getAggregationResults().get(0).getString("value")); } else { val = brokerResponse.getAggregationResults().get(0).getJSONArray("groupByResult"); } if (isAccurate) { // store accurate value accurateValue = val; isAccurate = false; } else { // compare value with accurate value // it's estimation so we need to test its result within error bound if (query instanceof AvroQueryGenerator.TestSimpleAggreationQuery) { TestUtils.assertApproximation((Double) val, (Double) accurateValue, precision); } else { TestUtils.assertJSONArrayApproximation( (JSONArray) val, (JSONArray) accurateValue, precision); } isAccurate = true; } } }