package org.teiid.translator.cassandra; import static org.junit.Assert.*; import java.util.Properties; import java.util.TimeZone; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.teiid.cdk.CommandBuilder; import org.teiid.core.util.TimestampWithTimezone; import org.teiid.language.Command; import org.teiid.metadata.MetadataFactory; import org.teiid.metadata.Table; import org.teiid.query.metadata.CompositeMetadataStore; import org.teiid.query.metadata.QueryMetadataInterface; import org.teiid.query.metadata.SystemMetadata; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.unittest.RealMetadataFactory; import org.teiid.translator.TypeFacility; @SuppressWarnings("nls") public class TestTeiidLanguageToCQL { private QueryMetadataInterface cassandraMetadata(Properties modelProperties) { MetadataFactory factory = new MetadataFactory("", 1, "", SystemMetadata.getInstance().getRuntimeTypeMap(), modelProperties, ""); createFakeMetadata(factory); return new TransformationMetadata(null, new CompositeMetadataStore(factory.asMetadataStore()), null, RealMetadataFactory.SFM.getSystemFunctions(), null); } private void createFakeMetadata(MetadataFactory factory) { Table person = factory.addTable("Person"); factory.addColumn("id", TypeFacility.RUNTIME_NAMES.INTEGER, person); factory.addColumn("name", TypeFacility.RUNTIME_NAMES.STRING, person); factory.addColumn("age", TypeFacility.RUNTIME_NAMES.INTEGER, person); factory.addColumn("bday", TypeFacility.RUNTIME_NAMES.TIMESTAMP, person); factory.addColumn("employed", TypeFacility.RUNTIME_NAMES.BOOLEAN, person); factory.addColumn("custom", TypeFacility.RUNTIME_NAMES.VARBINARY, person); factory.addColumn("custom1", TypeFacility.RUNTIME_NAMES.BLOB, person); Properties pros = factory.getModelProperties(); for(Object key: pros.keySet()) { person.setProperty(key.toString(), pros.getProperty(key.toString())); } } private String getTranslation(String sql, Properties modelProperties){ CommandBuilder builder = new CommandBuilder(cassandraMetadata(modelProperties)); Command c = builder.getCommand(sql); CassandraSQLVisitor visitor = new CassandraSQLVisitor(); visitor.translateSQL(c); return visitor.getTranslatedSQL(); } @Test public void testSelect() throws Exception{ Properties props = new Properties(); assertEquals("SELECT id FROM Person", getTranslation("select id FROM Person", props)); assertEquals("SELECT name, age FROM Person", getTranslation("select name,age from Person", props)); assertEquals("SELECT id, name, age, bday, employed, custom, custom1 FROM Person", getTranslation("SELECT * FROM Person", props)); assertEquals("SELECT COUNT(*) FROM Person LIMIT 10", getTranslation("SELECT count(*) FROM Person limit 10", props)); assertEquals("SELECT id, name, age FROM Person WHERE id = 1 AND age >= 18 AND age <= 100", getTranslation("SELECT id, name, age from Person where id=1 and age>=18 and age<=100", props)); assertEquals("SELECT id, name, age FROM Person WHERE id IN (1, 2, 3)", getTranslation("SELECT id, name, age from Person where id in(1,2,3)", props)); assertEquals("SELECT id FROM Person WHERE bday = -2208949200000 AND employed = TRUE", getTranslation("select id from Person where bday = {ts '1900-01-01 12:00:00'} and employed = true", props)); //assertEquals("SELECT id FROM Person where custom = X'abcd'", getTranslation("SELECT id FROM Person WHERE custom = 0xABCD", props)); // assertEquals("INSERT into Person (id, custom1) values (1, X'abcd')",getTranslation("INSERT INTO Person (id, custom1) VALUES (1, 0xABCD)", props)); } @Test public void testSelectWithAllowFiltering() throws Exception { Properties props = new Properties(); props.put(CassandraMetadataProcessor.ALLOWFILTERING, "TRUE"); assertEquals("SELECT id, name, age, bday, employed, custom, custom FROM Person WHERE age = 8 ALLOW FILTERING", getTranslation("select id, name, age, bday, employed, custom, custom from Person WHERE age = 8", props)); } @BeforeClass public static void oneTimeSetup() { TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("GMT+1")); } @AfterClass public static void oneTimeTeardown() { TimestampWithTimezone.resetCalendar(null); } }