/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* Licensed 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 com.linkedin.pinot.client;
import java.io.InputStream;
import java.util.concurrent.Future;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* Tests deserialization of a ResultSet given hardcoded Pinot results.
*
*/
public class ResultSetGroupTest {
@Test
public void testDeserializeSelectionResultSet() {
// Deserialize selection result
ResultSetGroup resultSetGroup = getResultSet("selection.json");
ResultSet resultSet = resultSetGroup.getResultSet(0);
// Check length
Assert.assertEquals(resultSetGroup.getResultSetCount(), 1, "Expected one result set for selection query");
Assert.assertEquals(resultSet.getRowCount(), 24, "Mismatched selection query length");
// Check that values match and are in the same order
Assert.assertEquals(resultSet.getInt(0, 0), 84);
Assert.assertEquals(resultSet.getLong(1, 0), 202L);
Assert.assertEquals(resultSet.getString(2, 0), "95");
Assert.assertEquals(resultSet.getInt(0, 78), 2014);
// Check the columns
Assert.assertEquals(resultSet.getColumnCount(), 79);
Assert.assertEquals(resultSet.getColumnName(0), "ActualElapsedTime");
Assert.assertEquals(resultSet.getColumnName(1), "AirTime");
}
@Test
public void testDeserializeAggregationResultSet() throws Exception {
// Deserialize aggregation result
ResultSetGroup resultSetGroup = getResultSet("aggregation.json");
// Check length and number of result groups
Assert.assertEquals(resultSetGroup.getResultSetCount(), 1, "Result set count mismatch");
ResultSet resultSet = resultSetGroup.getResultSet(0);
Assert.assertEquals(resultSet.getGroupKeyLength(), 0, "Expected 0 length group key for non-group by aggregation query");
Assert.assertEquals(resultSet.getRowCount(), 1, "Result group length mismatch");
// Check that values match and are in the same order
Assert.assertEquals(resultSet.getInt(0), 36542, "Mismatched int value");
Assert.assertEquals(resultSet.getLong(0), 36542L, "Mismatched long value");
Assert.assertEquals(resultSet.getString(0), "36542", "Mismatched String value");
// Check the columns
Assert.assertEquals(resultSet.getColumnCount(), 1);
Assert.assertEquals(resultSet.getColumnName(0), "count_star");
}
@Test
public void testDeserializeAggregationGroupByResultSet() {
// Deserialize aggregation group by result
ResultSetGroup resultSetGroup = getResultSet("aggregationGroupBy.json");
// Check length and number of result groups
Assert.assertEquals(resultSetGroup.getResultSetCount(), 1, "Result set count mismatch");
ResultSet resultSet = resultSetGroup.getResultSet(0);
Assert.assertEquals(resultSet.getGroupKeyLength(), 1, "Group key length mismatch");
Assert.assertEquals(resultSet.getRowCount(), 10, "Result group length mismatch");
// Check that values match and are in the same order
Assert.assertEquals(resultSet.getGroupKeyInt(0, 0), 30194);
Assert.assertEquals(resultSet.getGroupKeyLong(1, 0), 31057L);
Assert.assertEquals(resultSet.getGroupKeyString(2, 0), "32467");
Assert.assertEquals(resultSet.getInt(0), 3604);
Assert.assertEquals(resultSet.getLong(1), 1804L);
Assert.assertEquals(resultSet.getString(2), "1316");
// Check the columns
Assert.assertEquals(resultSet.getColumnCount(), 1);
Assert.assertEquals(resultSet.getColumnName(0), "count_star");
}
@Test
public void testDeserializeExceptionResultSet() {
try {
getResultSet("exception.json");
Assert.fail("Execute should have thrown an exception");
} catch (PinotClientException e) {
// We expect an exception here
}
}
private ResultSetGroup getResultSet(String resourceName) {
_dummyJsonTransport._resource = resourceName;
Connection connection = ConnectionFactory.fromHostList("dummy");
return connection.execute("dummy");
}
private DummyJsonTransport _dummyJsonTransport = new DummyJsonTransport();
private PinotClientTransportFactory _previousTransportFactory = null;
class DummyJsonTransport implements PinotClientTransport {
public String _resource;
@Override
public BrokerResponse executeQuery(String brokerAddress, String query)
throws PinotClientException {
try {
StringBuilder builder = new StringBuilder();
InputStream stream = getClass().getResourceAsStream(_resource);
int lastByte = stream.read();
while (lastByte != -1) {
builder.append((char)lastByte);
lastByte = stream.read();
}
String jsonText = builder.toString();
return BrokerResponse.fromJson(new JSONObject(jsonText));
} catch (Exception e) {
Assert.fail("Unexpected exception", e);
return null;
}
}
@Override
public Future<BrokerResponse> executeQueryAsync(String brokerAddress, String query)
throws PinotClientException {
return null;
}
}
class DummyJsonTransportFactory implements PinotClientTransportFactory {
@Override
public PinotClientTransport buildTransport() {
return _dummyJsonTransport;
}
}
@BeforeClass
public void overridePinotClientTransport() {
_previousTransportFactory = ConnectionFactory._transportFactory;
ConnectionFactory._transportFactory = new DummyJsonTransportFactory();
}
@AfterClass
public void resetPinotClientTransport() {
ConnectionFactory._transportFactory = _previousTransportFactory;
}
}