/**
  * @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;
     }
   }
 }
Exemplo n.º 2
0
  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;
      }
    }
  }