/* * 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.solr; import static org.junit.Assert.*; import java.io.IOException; import java.net.URLDecoder; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.teiid.cdk.CommandBuilder; import org.teiid.cdk.api.TranslationUtility; import org.teiid.core.util.ObjectConverterUtil; import org.teiid.core.util.TimestampWithTimezone; import org.teiid.core.util.UnitTestUtil; import org.teiid.language.Command; import org.teiid.language.Select; import org.teiid.query.metadata.QueryMetadataInterface; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.unittest.RealMetadataFactory; @SuppressWarnings("nls") public class TestTeiidLanguageToSolr { private TransformationMetadata metadata; private SolrExecutionFactory translator; private TranslationUtility utility; private QueryMetadataInterface setUp(String ddl, String vdbName, String modelName) throws Exception { this.translator = new SolrExecutionFactory(); this.translator.start(); metadata = RealMetadataFactory.fromDDL(ddl, vdbName, modelName); this.utility = new TranslationUtility(metadata); return metadata; } private String getSolrTranslation(String sql) throws IOException, Exception { Select select = (Select) getCommand(sql); SolrSQLHierarchyVistor visitor = new SolrSQLHierarchyVistor(this.utility.createRuntimeMetadata(), this.translator); visitor.visit(select); String cmd = visitor.getSolrQuery().toString(); return URLDecoder.decode(cmd, "UTF-8"); } public Command getCommand(String sql) throws IOException, Exception { CommandBuilder builder = new CommandBuilder(setUp(ObjectConverterUtil.convertFileToString(UnitTestUtil.getTestDataFile("exampleTBL.ddl")), "exampleVDB","exampleModel")); return builder.getCommand(sql); } @Test public void testSelectStar() throws Exception { // column test, all columns translates to price, weight and popularity assertEquals("fl=price,weight,popularity,name,purchasets,purchasetime,purchasedate,nis&q=*:*", getSolrTranslation("select * from example")); } @Test public void testSelectColumn() throws Exception { assertEquals("fl=price,weight&q=*:*", getSolrTranslation("select price,weight from example")); } @Test public void testSelectWhereEQ() throws Exception { assertEquals("fl=price,weight,popularity&q=price:1.0", getSolrTranslation("select price,weight,popularity from example where price=1")); } @Test public void testSelectWhereEQNegitive() throws Exception { assertEquals("fl=price,weight,popularity&q=price:\\-1.0", getSolrTranslation("select price,weight,popularity from example where price=-1")); } @Test public void testSelectWhereNE() throws Exception { assertEquals("fl=price,weight,popularity&q=NOT price:1.0", getSolrTranslation("select price,weight,popularity from example where price!=1")); } @Test public void testSelectWhereNEString() throws Exception { assertEquals("fl=price,weight,popularity&q=NOT name:test", getSolrTranslation("select price,weight,popularity from example where name!='test'")); } // only need to preform LT bc SOLR does not handle strict <,> only <=,>= @Test public void testSelectWhereGT() throws Exception { assertEquals("fl=price,weight,popularity&q=price:[1.0 TO *] AND NOT price:1.0", getSolrTranslation("select price,weight,popularity from example where price>1")); } // only need to preform LT bc SOLR does not handle strict <,> only <=,>= @Test public void testSelectWhereGE() throws Exception { assertEquals("fl=price,weight,popularity&q=price:[1.0 TO *]", getSolrTranslation("select price,weight,popularity from example where price>=1")); } // only need to preform LT bc SOLR does not handle strict <,> only <=,>= @Test public void testSelectWhereLT() throws Exception { assertEquals("fl=price,weight,popularity&q=price:[* TO 1.0] AND NOT price:1.0", getSolrTranslation("select price,weight,popularity from example where price<1")); } // only need to preform LT bc SOLR does not handle strict <,> only <=,>= @Test public void testSelectWhereLE() throws Exception { assertEquals("fl=price,weight,popularity&q=price:[* TO 1.0]", getSolrTranslation("select price,weight,popularity from example where price<=1")); } @Test public void testSelectWhereNEQ() throws Exception { assertEquals("fl=price,weight,popularity&q=NOT price:1.0", getSolrTranslation("select price,weight,popularity from example where price!=1")); } @Test public void testSelectWhenOr() throws Exception { assertEquals("fl=price,weight,popularity&q=((price:1.0) OR (weight:[5.0 TO *]))", getSolrTranslation("select price,weight,popularity from example where price=1 or weight >=5")); } @Test public void testSelectWhenNotOr() throws Exception { assertEquals("fl=price,weight,popularity&q=((NOT price:1.0) AND (weight:[* TO 5.0]))", getSolrTranslation("select price,weight,popularity from example where Not (price=1 or weight >5)")); } @Test public void testSelectWhenNotOrString() throws Exception { assertEquals("fl=price,weight,popularity&q=((NOT name:*sung) AND (weight:[* TO 5.0]))", getSolrTranslation("select price,weight,popularity from example where Not (name like '%sung' or weight >5)")); } @Test public void testSelectWhenAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((price:1.0) AND (weight:[5.0 TO *]))", getSolrTranslation("select price,weight,popularity from example where price=1 AND weight >=5")); } @Test public void testSelectWhenAndOr() throws Exception { assertEquals("fl=price,weight,popularity&q=((((weight:[5.0 TO *] AND NOT weight:5.0) AND (price:1.0))) OR (weight:[5.0 TO *] AND NOT weight:5.0))", getSolrTranslation("select price,weight,popularity from example where weight > 5 AND price=1 or weight > 5")); } @Test public void testSelectWhenAndOrOr() throws Exception { assertEquals("fl=price,weight,popularity&q=((((weight:[5.0 TO *] AND NOT weight:5.0) AND (price:1.0))) OR (((weight:[5.0 TO *] AND NOT weight:5.0) OR (popularity:[* TO 1] AND NOT popularity:1))))", getSolrTranslation("select price,weight,popularity from example where weight > 5 AND price=1 or weight > 5 or popularity < 1")); } @Test public void testSelectWhenLike() throws Exception { assertEquals("fl=price,weight,popularity&q=name:*sung", getSolrTranslation("select price,weight,popularity from example where name like '%sung'")); } @Test public void testSelectWhenLikeAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((name:*sung) AND (price:1.0))", getSolrTranslation("select price,weight,popularity from example where name like '%sung' and price=1")); } @Test public void testSelectWhenOrLikeAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((popularity:[* TO 1]) OR (((name:*sung) AND (price:1.0))))", getSolrTranslation("select price,weight,popularity from example where popularity <= 1 Or name like '%sung' and price=1")); } @Test public void testSelectWhenOrNotLikeAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((popularity:[* TO 1]) OR (((NOT name:*sung) AND (price:1.0))))", getSolrTranslation("select price,weight,popularity from example where popularity <= 1 Or name not like '%sung' and price=1")); } @Test public void testSelectWhenInString() throws Exception { assertEquals("fl=price,weight,popularity&q=name:(3 OR 2 OR 1)", getSolrTranslation("select price,weight,popularity from example where name in ('1','2','3')")); } @Test public void testSelectWhenIn() throws Exception { assertEquals("fl=price,weight,popularity&q=popularity:(3 OR 2 OR 1)", getSolrTranslation("select price,weight,popularity from example where popularity in (1,2,3)")); } @Test public void testSelectWhenOrInAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((weight:1.0) OR (((popularity:(3 OR 2 OR 1)) AND (price:1.0))))", getSolrTranslation("select price,weight,popularity from example where weight = 1 or popularity in (1,2,3) and price = 1")); } @Test public void testSelectWhenNotIn() throws Exception { assertEquals("fl=price,weight,popularity&q=NOT popularity:(3 OR 2 OR 1)", getSolrTranslation("select price,weight,popularity from example where popularity not in (1,2,3)")); } @Test public void testSelectWhenNotAnd() throws Exception { assertEquals("fl=price,weight,popularity&q=((weight:1.0) AND (NOT popularity:(3 OR 2 OR 1)))", getSolrTranslation("select price,weight,popularity from example where weight = 1 AND not popularity in (1,2,3)")); } @Test public void testSelectWhenAndNotAndAndLike() throws Exception { assertEquals("fl=price,weight,popularity&q=((weight:1.0) AND (((NOT popularity:(3 OR 2 OR 1)) OR (NOT name:*sung))))", getSolrTranslation("select price,weight,popularity from example where weight = 1 AND not (popularity in (1,2,3) and name like '%sung')")); } @Test public void testLimit() throws Exception { assertEquals("fl=name,popularity&rows=21&start=2&q=*:*", getSolrTranslation("select name,popularity from example limit 2, 21")); } @Test public void testOrderBy() throws Exception { assertEquals("fl=name,popularity&sort=popularity asc&q=*:*", getSolrTranslation("select name,popularity from example order by popularity ASC")); } @Test public void testOrderByWithAlias() throws Exception { assertEquals("fl=name,popularity&sort=popularity asc&q=*:*", getSolrTranslation("select name as c_0,popularity c_1 from example order by c_1 ASC")); } @Test public void testTimestampField() throws Exception { Date d = getTestDate(); assertEquals("fl=name,purchasedate&q=purchasets:2014\\-02\\-06T19\\:52\\:07\\:000Z", getSolrTranslation("select name,purchasedate from example where purchasets = {ts '"+new Timestamp(d.getTime())+"'}")); } @Test public void testDateField() throws Exception { Date d = getTestDate(); assertEquals("fl=name,purchasedate&q=purchasedate:2014\\-02\\-06T08\\:00\\:00\\:000Z", getSolrTranslation("select name,purchasedate from example where purchasedate = {d '"+new java.sql.Date(d.getTime())+"'}")); } @Test public void testTimeField() throws Exception { Date d = getTestDate(); assertEquals("fl=name,purchasedate&q=purchasetime:1970\\-01\\-01T19\\:52\\:07\\:000Z", getSolrTranslation("select name,purchasedate from example where purchasetime = {t '"+new Time(d.getTime())+"'}")); } private Date getTestDate() { Calendar c = TimestampWithTimezone.getCalendar(); c.setTimeInMillis(0); c.set(2014, 1, 6, 11, 52, 07); return c.getTime(); } @Test public void testFunction() throws Exception { assertEquals("fl=name,sum(popularity,1)&sort=popularity asc&q=*:*", getSolrTranslation("select name,popularity+1 from example order by popularity ASC")); } @Test public void testNestedFunction() throws Exception { assertEquals("fl=name,div(sum(popularity,1),2)&sort=popularity asc&q=*:*", getSolrTranslation("select name,(popularity+1)/2 as x from example order by popularity ASC")); } @Before public void setUp() { TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("PST")); //$NON-NLS-1$ } @After public void tearDown() { TimestampWithTimezone.resetCalendar(null); } }