/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.accumulo;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.admin.TimeType;
import org.apache.accumulo.core.client.mock.MockInstance;
import org.apache.accumulo.core.client.security.tokens.PasswordToken;
import org.apache.accumulo.core.security.Authorizations;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.cdk.api.TranslationUtility;
import org.teiid.core.types.GeometryType;
import org.teiid.core.util.ObjectConverterUtil;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.language.Command;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.translator.Execution;
import org.teiid.translator.ExecutionContext;
import org.teiid.translator.TranslatorException;
@SuppressWarnings({"nls", "unchecked"})
public class TestAccumuloQueryExecution {
private static AccumuloExecutionFactory translator;
private static TranslationUtility utility;
private static AccumuloConnection connection;
@BeforeClass
public static void setUp() throws Exception {
translator = new AccumuloExecutionFactory();
translator.start();
TransformationMetadata metadata = RealMetadataFactory.fromDDL(ObjectConverterUtil.convertFileToString(UnitTestUtil.getTestDataFile("sampledb.ddl")), "sakila", "rental");
utility = new TranslationUtility(metadata);
MockInstance instance = new MockInstance("teiid");
connection = Mockito.mock(AccumuloConnection.class);
Connector connector = instance.getConnector("root", new PasswordToken(""));
Mockito.stub(connection.getInstance()).toReturn(connector);
Mockito.stub(connection.getAuthorizations()).toReturn(new Authorizations("public"));
connector.tableOperations().create("customer", true, TimeType.LOGICAL);
connector.tableOperations().create("rental", true, TimeType.LOGICAL);
}
private Execution executeCmd(String sql) throws TranslatorException {
Command cmd = TestAccumuloQueryExecution.utility.parseCommand(sql);
Execution exec = translator.createExecution(cmd, Mockito.mock(ExecutionContext.class),
utility.createRuntimeMetadata(), TestAccumuloQueryExecution.connection);
exec.execute();
return exec;
}
@Test
public void testExecution() throws Exception {
executeCmd("delete from customer");
executeCmd("insert into customer (customer_id, firstname, lastname) values (2, 'Joe', 'A')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (1, 'John', 'B')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (3, 'Jack', 'C')");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select * from customer");
assertEquals(Arrays.asList(1, "John", "B"), exec.next());
assertEquals(Arrays.asList(2, "Joe", "A"), exec.next());
assertEquals(Arrays.asList(3, "Jack", "C"), exec.next());
assertNull(exec.next());
executeCmd("Update Customer set firstname = 'Jill' where customer_id = 2");
executeCmd("Update Customer set firstname = 'Jay' where customer_id = 2");
exec = (AccumuloQueryExecution)executeCmd("select customer_id, firstname from customer");
assertEquals(Arrays.asList(1, "John"), exec.next());
assertEquals(Arrays.asList(2, "Jay"), exec.next());
assertEquals(Arrays.asList(3, "Jack"), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution)executeCmd("select customer_id, firstname from customer where customer_id = 2");
assertEquals(Arrays.asList(2, "Jay"), exec.next());
assertNull(exec.next());
executeCmd("delete from Customer where customer_id = 2");
exec = (AccumuloQueryExecution)executeCmd("select * from customer");
assertEquals(Arrays.asList(1, "John", "B"), exec.next());
assertEquals(Arrays.asList(3, "Jack", "C"), exec.next());
assertNull(exec.next());
}
@Test
public void testValueInCQ() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select * from rental");
assertEquals(Arrays.asList(1, new BigDecimal("3.99"), 5), exec.next());
assertEquals(Arrays.asList(2, new BigDecimal("5.99"), 2), exec.next());
assertEquals(Arrays.asList(3, new BigDecimal("11.99"), 1), exec.next());
assertNull(exec.next());
}
@Test
public void testCountStar() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select count(*) from rental");
assertEquals(Arrays.asList(4), exec.next());
assertNull(exec.next());
}
@Test
public void testIsNULL() throws Exception {
executeCmd("delete from customer");
executeCmd("insert into customer (customer_id, firstname, lastname) values (2, 'Joe', 'A')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (1, null, 'B')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (3, 'Jack', 'C')");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select * from customer where firstname IS NULL");
assertEquals(Arrays.asList(1, null, "B"), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution)executeCmd("select * from customer where firstname IS NOT NULL");
//assertEquals(Arrays.asList(2, "Joe", "A"), exec.next());
//assertEquals(Arrays.asList(3, "Jack", "C"), exec.next());
assertNotNull(exec.next());
assertNotNull(exec.next());
assertNull(exec.next());
}
@Test
public void testINOnNonPKColumn() throws Exception {
executeCmd("delete from customer");
executeCmd("insert into customer (customer_id, firstname, lastname) values (2, 'Joe', 'A')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (1, 'John', 'B')");
executeCmd("insert into customer (customer_id, firstname, lastname) values (3, 'Jack', 'C')");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select * from customer where "
+ "firstname IN('Joe', 'Jack') order by lastname");
assertEquals(Arrays.asList(2, "Joe", "A"), exec.next());
assertEquals(Arrays.asList(3, "Jack", "C"), exec.next());
// assertNotNull(exec.next());
// assertNotNull(exec.next());
assertNull(exec.next());
}
@Test
public void testComparisionOnNonPKColumn() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select rental_id, amount, "
+ "customer_id from rental where amount > 6.01");
assertEquals(Arrays.asList(3, new BigDecimal("11.99"), 1), exec.next());
assertEquals(Arrays.asList(4, new BigDecimal("12.99"), 1), exec.next());
assertNull(exec.next());
}
@Test
public void testANDOnNonPKColumn() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select rental_id, amount, "
+ "customer_id from rental where amount > 5.99 and amount < 12.99");
assertEquals(Arrays.asList(3, new BigDecimal("11.99"), 1), exec.next());
assertNull(exec.next());
}
@Test
public void testOROnNonPKColumn() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select amount from rental "
+ "where amount > 5.99 or customer_id = 1");
assertEquals(Arrays.asList(new BigDecimal("11.99")), exec.next());
assertEquals(Arrays.asList(new BigDecimal("12.99")), exec.next());
assertNull(exec.next());
}
@Test
public void testPKColumn() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select amount from rental "
+ "where rental_id = 3");
assertEquals(Arrays.asList(new BigDecimal("11.99")), exec.next());
assertNull(exec.next());
}
@Test
public void testNonPKColumn() throws Exception {
executeCmd("delete from rental");
executeCmd("insert into rental (rental_id, amount, customer_id) values (1, 3.99, 5)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (2, 5.99, 2)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (3, 11.99, 1)");
executeCmd("insert into rental (rental_id, amount, customer_id) values (4, 12.99, 1)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select amount from rental "
+ "where customer_id >= 1 and customer_id < 2");
assertEquals(Arrays.asList(new BigDecimal("11.99")), exec.next());
assertEquals(Arrays.asList(new BigDecimal("12.99")), exec.next());
assertNull(exec.next());
}
@Test //TEIID-3933
public void testNumericComparision() throws Exception {
executeCmd("delete from smalla");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (1, 1,1.99, 1)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (2, 2, 2.99, 2)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (3, 3, 3.99, 3)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (4, 4, 4.99, 4)");
AccumuloQueryExecution exec = (AccumuloQueryExecution) executeCmd("select ROWID from smalla "
+ "where LONGNUM > 2");
assertEquals(Arrays.asList(new Integer(3)), exec.next());
assertEquals(Arrays.asList(new Integer(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID from smalla "
+ "where DOUBLENUM > 3");
assertEquals(Arrays.asList(new Integer(3)), exec.next());
assertEquals(Arrays.asList(new Integer(4)), exec.next());
assertNull(exec.next());
}
@Test //TEIID-3930
public void testSelectRowID() throws Exception {
executeCmd("delete from smalla");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (1, 1,1.99, 1)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (2, 2, 2.99, 2)");
AccumuloQueryExecution exec = (AccumuloQueryExecution)executeCmd("select ROWID from smalla");
assertEquals(Arrays.asList(new Integer("1")), exec.next());
assertEquals(Arrays.asList(new Integer("2")), exec.next());
assertNull(exec.next());
}
@Test //TEIID-3944
public void testRowIDNumericComparision() throws Exception {
executeCmd("delete from smalla");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (1, 1,1.99, 1)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (2, 2, 2.99, 2)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (3, 3, 3.99, 3)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (4, 4, 4.99, 4)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (15, 15, 15.99, 15)");
executeCmd("insert into smalla (ROWID, LONGNUM, DOUBLENUM, BIGINTEGERVALUE) values (16, 16, 16.99, 16)");
AccumuloQueryExecution exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID > 2");
assertEquals(Arrays.asList(new Integer(15), new Long(15)), exec.next());
assertEquals(Arrays.asList(new Integer(16), new Long(16)), exec.next());
assertEquals(Arrays.asList(new Integer(3), new Long(3)), exec.next());
assertEquals(Arrays.asList(new Integer(4), new Long(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID >= 2");
assertEquals(Arrays.asList(new Integer(15), new Long(15)), exec.next());
assertEquals(Arrays.asList(new Integer(16), new Long(16)), exec.next());
assertEquals(Arrays.asList(new Integer(2), new Long(2)), exec.next());
assertEquals(Arrays.asList(new Integer(3), new Long(3)), exec.next());
assertEquals(Arrays.asList(new Integer(4), new Long(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID < 3");
assertEquals(Arrays.asList(new Integer(1), new Long(1)), exec.next());
assertEquals(Arrays.asList(new Integer(2), new Long(2)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID <= 3");
assertEquals(Arrays.asList(new Integer(1), new Long(1)), exec.next());
assertEquals(Arrays.asList(new Integer(2), new Long(2)), exec.next());
assertEquals(Arrays.asList(new Integer(3), new Long(3)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID != 3");
assertEquals(Arrays.asList(new Integer(1), new Long(1)), exec.next());
assertEquals(Arrays.asList(new Integer(15), new Long(15)), exec.next());
assertEquals(Arrays.asList(new Integer(16), new Long(16)), exec.next());
assertEquals(Arrays.asList(new Integer(2), new Long(2)), exec.next());
assertEquals(Arrays.asList(new Integer(4), new Long(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd("select ROWID, LONGNUM from smalla "
+ "where ROWID = 3");
assertEquals(Arrays.asList(new Integer(3), new Long(3)), exec.next());
assertNull(exec.next());
}
@Test //TEIID-3944
public void testNullRowSelection() throws Exception {
executeCmd("delete from smalla");
executeCmd("insert into smalla (ROWID, LONGNUM, BIGINTEGERVALUE) values (1, null, 1)");
executeCmd("insert into smalla (ROWID, LONGNUM, BIGINTEGERVALUE) values (2, null, null)");
executeCmd("insert into smalla (ROWID, LONGNUM, BIGINTEGERVALUE) values (3, 3, null)");
executeCmd("insert into smalla (ROWID, LONGNUM, BIGINTEGERVALUE) values (4, 4, 4)");
AccumuloQueryExecution exec = (AccumuloQueryExecution) executeCmd(
"select ROWID, LONGNUM, BIGINTEGERVALUE from smalla");
assertEquals(Arrays.asList(new Integer(1), null, new BigInteger("1")), exec.next());
assertEquals(Arrays.asList(new Integer(2), null, null), exec.next());
assertEquals(Arrays.asList(new Integer(3), new Long(3), null), exec.next());
assertEquals(Arrays.asList(new Integer(4), new Long(4), new BigInteger("4")), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd(
"select LONGNUM from smalla");
ArrayList<?> NULL_ARRAY = new ArrayList();
NULL_ARRAY.add(null);
assertEquals(NULL_ARRAY, exec.next());
assertEquals(NULL_ARRAY, exec.next());
assertEquals(Arrays.asList(new Long(3)), exec.next());
assertEquals(Arrays.asList(new Long(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd(
"select LONGNUM as foo from smalla");
assertEquals(NULL_ARRAY, exec.next());
assertEquals(NULL_ARRAY, exec.next());
assertEquals(Arrays.asList(new Long(3)), exec.next());
assertEquals(Arrays.asList(new Long(4)), exec.next());
assertNull(exec.next());
exec = (AccumuloQueryExecution) executeCmd(
"select ROWID, LONGNUM as foo from smalla where LONGNUM is null");
assertEquals(Arrays.asList(new Integer(1), null), exec.next());
assertEquals(Arrays.asList(new Integer(2), null), exec.next());
assertNull(exec.next());
}
@Test public void testAccumuloDataTypeManager() throws SQLException {
GeometryType gt = new GeometryType(new byte[10]);
gt.setSrid(4000);
byte[] bytes = AccumuloDataTypeManager.serialize(gt);
GeometryType gt1 = (GeometryType) AccumuloDataTypeManager.deserialize(bytes, GeometryType.class);
assertEquals(4000, gt1.getSrid());
assertEquals(10, gt1.length());
}
}