blob: bd8752bd16dc0f576f790356fdc734855874c262 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.pinot.queries;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import org.apache.pinot.common.response.broker.BrokerResponseNative;
import org.apache.pinot.common.response.broker.ResultTable;
import org.apache.pinot.common.utils.DataSchema;
import org.apache.pinot.common.utils.DataSchema.ColumnDataType;
import org.apache.pinot.core.common.ObjectSerDeUtils;
import org.apache.pinot.core.plan.maker.InstancePlanMakerImplV2;
import org.apache.pinot.spi.utils.BytesUtils;
import org.testng.annotations.Test;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
public class InterSegmentAggregationSingleValueQueriesTest extends BaseSingleValueQueriesTest {
private static final String GROUP_BY = " GROUP BY column9 ORDER BY v1 DESC, v2 DESC LIMIT 1";
// Allow 5% quantile error due to the randomness of TDigest merge
private static final double PERCENTILE_TDIGEST_DELTA = 0.05 * Integer.MAX_VALUE;
@Test
public void testCount() {
String query = "SELECT COUNT(*) FROM testTable";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema = new DataSchema(new String[]{"count(*)"}, new ColumnDataType[]{ColumnDataType.LONG});
Object[] expectedResults = new Object[]{120000L};
ResultTable expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(expectedResults));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResults[0] = 24516L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 0L, 120000L, expectedResultTable);
String groupBy = " GROUP BY column9 ORDER BY COUNT(*) DESC LIMIT 1";
brokerResponse = getBrokerResponse(query + groupBy);
expectedResults[0] = 64420L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 120000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + groupBy);
expectedResults[0] = 17080L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 24516L, 120000L, expectedResultTable);
query = "SELECT COUNT(*) AS v1 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedDataSchema = new DataSchema(new String[]{"v1"}, new ColumnDataType[]{ColumnDataType.LONG});
expectedResults = new Object[]{120000L};
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(expectedResults));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResults[0] = 24516L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 0L, 120000L, expectedResultTable);
groupBy = " GROUP BY column9 ORDER BY v1 DESC LIMIT 1";
brokerResponse = getBrokerResponse(query + groupBy);
expectedResults[0] = 64420L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 120000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + groupBy);
expectedResults[0] = 17080L;
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 24516L, 120000L, expectedResultTable);
}
@Test
public void testMax() {
String query = "SELECT MAX(column1) AS v1, MAX(column3) AS v2 FROM testTable";
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146952047.0, 2147419555.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146952047.0, 999813884.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146952047.0, 2146630496.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146952047.0, 999813884.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testMin() {
String query = "SELECT MIN(column1) AS v1, MIN(column3) AS v2 FROM testTable";
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{240528.0, 17891.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{101116473.0, 20396372.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
String groupBy = " GROUP BY column9 ORDER BY v1, v2 LIMIT 1";
brokerResponse = getBrokerResponse(query + groupBy);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{240528.0, 17891.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + groupBy);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{101116473.0, 91804599.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testSum() {
String query = "SELECT SUM(column1) AS v1, SUM(column3) AS v2 FROM testTable";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
ResultTable expectedResultTable = new ResultTable(expectedDataSchema,
Collections.singletonList(new Object[]{129268741751388.0, 129156636756600.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable = new ResultTable(expectedDataSchema,
Collections.singletonList(new Object[]{27503790384288.0, 12429178874916.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema,
Collections.singletonList(new Object[]{69526727335224.0, 69225631719808.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{19058003631876.0, 8606725456500.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testAvg() {
String query = "SELECT AVG(column1) AS v1, AVG(column3) AS v2 FROM testTable";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1077239514.5949, 1076305306.305}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable, 1e-5);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1121871038.68037, 506982332.96280}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable,
1e-5);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699.0, 334963174.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699.0, 334963174.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testMinMaxRange() {
String query = "SELECT MINMAXRANGE(column1) AS v1, MINMAXRANGE(column3) AS v2 FROM testTable";
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146711519.0, 2147401664.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2045835574.0, 979417512.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146711519.0, 2146612605.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2044094181.0, 979417512.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testDistinctCount() {
String query = "SELECT DISTINCTCOUNT(column1) AS v1, DISTINCTCOUNT(column3) AS v2 FROM testTable";
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.INT});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{6582, 21910}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1872, 4556}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{3495, 11961}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1272, 3289}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testDistinctCountHLL() {
String query = "SELECT DISTINCTCOUNTHLL(column1) AS v1, DISTINCTCOUNTHLL(column3) AS v2 FROM testTable";
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.LONG, ColumnDataType.LONG});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{5977L, 23825L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1886L, 4492L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{3592L, 11889L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1324L, 3197L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testDistinctCountRawHLL() {
String query = "SELECT DISTINCTCOUNTRAWHLL(column1) AS v1, DISTINCTCOUNTRAWHLL(column3) AS v2 FROM testTable";
Function<Object, Object> cardinalityExtractor =
value -> ObjectSerDeUtils.HYPER_LOG_LOG_SER_DE.deserialize(BytesUtils.toBytes((String) value)).cardinality();
// Without filter, query should be answered by DictionaryBasedAggregationOperator (numEntriesScannedPostFilter = 0)
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.LONG, ColumnDataType.LONG});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{5977L, 23825L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 0L, 120000L, expectedResultTable,
cardinalityExtractor);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1886L, 4492L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable,
cardinalityExtractor);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{3592L, 11889L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable,
cardinalityExtractor);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable = new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1324L, 3197L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable,
cardinalityExtractor);
}
@Test
public void testPercentile() {
List<String> queries =
Arrays.asList("SELECT PERCENTILE50(column1) AS v1, PERCENTILE50(column3) AS v2 FROM testTable",
"SELECT PERCENTILE(column1, 50) AS v1, PERCENTILE(column3, 50) AS v2 FROM testTable",
"SELECT PERCENTILE(column1, '50') AS v1, PERCENTILE(column3, '50') AS v2 FROM testTable");
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.DOUBLE, ColumnDataType.DOUBLE});
for (String query : queries) {
BrokerResponseNative brokerResponse = getBrokerResponse(query);
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1107310944.0, 1080136306.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1139674505.0, 505053732.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843.0, 1418523221.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699.0, 334963174.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
String query = "SELECT PERCENTILE90(column1) AS v1, PERCENTILE90(column3) AS v2 FROM testTable";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1943040511.0, 1936611145.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1936730975.0, 899534534.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843.0, 1418523221.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699.0, 334963174.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
query = "SELECT PERCENTILE95(column1) AS v1, PERCENTILE95(column3) AS v2 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2071559385.0, 2042409652.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2096857943.0, 947763150.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843.0, 1418523221.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699.0, 334963174.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
query = "SELECT PERCENTILE99(column1) AS v1, PERCENTILE99(column3) AS v2 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2139354437.0, 2125299552.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146232405.0, 990669195.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843.0, 1418523221.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146232405.0, 990259756.0}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testPercentileEst() {
String query = "SELECT PERCENTILEEST50(column1) AS v1, PERCENTILEEST50(column3) AS v2 FROM testTable";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
DataSchema expectedDataSchema =
new DataSchema(new String[]{"v1", "v2"}, new ColumnDataType[]{ColumnDataType.LONG, ColumnDataType.LONG});
ResultTable expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1107310944L, 1082130431L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1139674505L, 509607935L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843L, 1418523221L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699L, 334963174L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
query = "SELECT PERCENTILEEST90(column1) AS v1, PERCENTILEEST90(column3) AS v2 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1946157055L, 1946157055L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{1939865599L, 902299647L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843L, 1418523221L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699L, 334963174L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
query = "SELECT PERCENTILEEST95(column1) AS v1, PERCENTILEEST95(column3) AS v2 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2080374783L, 2051014655L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2109734911L, 950009855L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843L, 1418523221L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2142595699L, 334963174L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
query = "SELECT PERCENTILEEST99(column1) AS v1, PERCENTILEEST99(column3) AS v2 FROM testTable";
brokerResponse = getBrokerResponse(query);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2143289343L, 2143289343L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 240000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146232405L, 991952895L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 49032L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146791843L, 1418523221L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 120000L, 0L, 360000L, 120000L, expectedResultTable);
brokerResponse = getBrokerResponse(query + FILTER + GROUP_BY);
expectedResultTable =
new ResultTable(expectedDataSchema, Collections.singletonList(new Object[]{2146232405L, 993001471L}));
QueriesTestUtils.testInterSegmentsResult(brokerResponse, 24516L, 252256L, 73548L, 120000L, expectedResultTable);
}
@Test
public void testPercentileRawEst() {
testPercentileRawEst(50);
testPercentileRawEst(90);
testPercentileRawEst(95);
testPercentileRawEst(99);
}
private void testPercentileRawEst(int percentile) {
Function<Object, Object> quantileExtractor =
value -> ObjectSerDeUtils.QUANTILE_DIGEST_SER_DE.deserialize(BytesUtils.toBytes((String) value))
.getQuantile(percentile / 100.0);
String rawQuery =
String.format("SELECT PERCENTILERAWEST%d(column1) AS v1, PERCENTILERAWEST%d(column3) AS v2 FROM testTable",
percentile, percentile);
String regularQuery =
String.format("SELECT PERCENTILEEST%d(column1) AS v1, PERCENTILEEST%d(column3) AS v2 FROM testTable",
percentile, percentile);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery), getBrokerResponse(regularQuery),
quantileExtractor);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + FILTER),
getBrokerResponse(regularQuery + FILTER), quantileExtractor);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + GROUP_BY),
getBrokerResponse(regularQuery + GROUP_BY), quantileExtractor);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + FILTER + GROUP_BY),
getBrokerResponse(regularQuery + FILTER + GROUP_BY), quantileExtractor);
}
@Test
public void testPercentileRawTDigest() {
testPercentileRawTDigest(50);
testPercentileRawTDigest(90);
testPercentileRawTDigest(95);
testPercentileRawTDigest(99);
}
private void testPercentileRawTDigest(int percentile) {
Function<Object, Object> quantileExtractor =
value -> ObjectSerDeUtils.TDIGEST_SER_DE.deserialize(BytesUtils.toBytes((String) value))
.quantile(percentile / 100.0);
String rawQuery = String.format(
"SELECT PERCENTILERAWTDIGEST%d(column1) AS v1, PERCENTILERAWTDIGEST%d(column3) AS v2 FROM testTable",
percentile, percentile);
String regularQuery =
String.format("SELECT PERCENTILETDIGEST%d(column1) AS v1, PERCENTILETDIGEST%d(column3) AS v2 FROM testTable",
percentile, percentile);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery), getBrokerResponse(regularQuery),
quantileExtractor, PERCENTILE_TDIGEST_DELTA);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + FILTER),
getBrokerResponse(regularQuery + FILTER), quantileExtractor, PERCENTILE_TDIGEST_DELTA);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + GROUP_BY),
getBrokerResponse(regularQuery + GROUP_BY), quantileExtractor, PERCENTILE_TDIGEST_DELTA);
QueriesTestUtils.testInterSegmentsResult(getBrokerResponse(rawQuery + FILTER + GROUP_BY),
getBrokerResponse(regularQuery + FILTER + GROUP_BY), quantileExtractor, PERCENTILE_TDIGEST_DELTA);
}
@Test
public void testNumGroupsLimit() {
String query = "SELECT COUNT(*) FROM testTable GROUP BY column1";
BrokerResponseNative brokerResponse = getBrokerResponse(query);
assertFalse(brokerResponse.isNumGroupsLimitReached());
brokerResponse = getBrokerResponse(query,
new InstancePlanMakerImplV2(1000, 1000, InstancePlanMakerImplV2.DEFAULT_MIN_SEGMENT_GROUP_TRIM_SIZE,
InstancePlanMakerImplV2.DEFAULT_MIN_SERVER_GROUP_TRIM_SIZE,
InstancePlanMakerImplV2.DEFAULT_GROUPBY_TRIM_THRESHOLD));
assertTrue(brokerResponse.isNumGroupsLimitReached());
}
}