/* * Copyright (C) 2014 Indeed Inc. * * 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.indeed.flamdex.query; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.indeed.flamdex.lucene.LuceneQueryTranslator; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.TermQuery; import org.junit.Test; import java.util.Collections; import static org.junit.Assert.assertEquals; /** * @author dwahler */ public class TestLuceneQueryTranslator { @Test public void testTerm() { Query q1 = LuceneQueryTranslator.rewrite(new TermQuery(new org.apache.lucene.index.Term("abc", "123")), ImmutableSet.<String>of()); assertEquals(Query.newTermQuery(new Term("abc", false, 0, "123")), q1); Query q2 = LuceneQueryTranslator.rewrite(new TermQuery(new org.apache.lucene.index.Term("abc", "123")), ImmutableSet.<String>of("abc")); assertEquals(Query.newTermQuery(new Term("abc", true, 123, "")), q2); } @Test public void testAnd() { final BooleanQuery bq = new BooleanQuery(); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "a")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "b")), BooleanClause.Occur.MUST); Query q1 = LuceneQueryTranslator.rewrite(bq, Collections.<String>emptySet()); assertEquals(Query.newBooleanQuery(BooleanOp.AND, ImmutableList.of( Query.newTermQuery(new Term("f", false, 0, "a")), Query.newTermQuery(new Term("f", false, 0, "b")) )), q1); } @Test public void testOr() { final BooleanQuery bq = new BooleanQuery(); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "a")), BooleanClause.Occur.SHOULD); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "b")), BooleanClause.Occur.SHOULD); Query q1 = LuceneQueryTranslator.rewrite(bq, Collections.<String>emptySet()); assertEquals(Query.newBooleanQuery(BooleanOp.OR, ImmutableList.of( Query.newTermQuery(new Term("f", false, 0, "a")), Query.newTermQuery(new Term("f", false, 0, "b")) )), q1); } @Test public void testMixed1() { final BooleanQuery bq = new BooleanQuery(); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "a")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "b")), BooleanClause.Occur.SHOULD); Query q1 = LuceneQueryTranslator.rewrite(bq, Collections.<String>emptySet()); assertEquals(Query.newBooleanQuery(BooleanOp.AND, ImmutableList.of( Query.newTermQuery(new Term("f", false, 0, "a")) )), q1); } @Test public void testMixed2() { final BooleanQuery bq = new BooleanQuery(); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "a")), BooleanClause.Occur.MUST); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "b")), BooleanClause.Occur.MUST_NOT); Query q1 = LuceneQueryTranslator.rewrite(bq, Collections.<String>emptySet()); assertEquals(Query.newBooleanQuery(BooleanOp.AND, ImmutableList.of( Query.newBooleanQuery(BooleanOp.AND, ImmutableList.of( Query.newTermQuery(new Term("f", false, 0, "a")))), Query.newBooleanQuery(BooleanOp.NOT, ImmutableList.<Query>of( Query.newTermQuery(new Term("f", false, 0, "b")))) )), q1); } @Test public void testNor() { final BooleanQuery bq = new BooleanQuery(); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "a")), BooleanClause.Occur.MUST_NOT); bq.add(new TermQuery(new org.apache.lucene.index.Term("f", "b")), BooleanClause.Occur.MUST_NOT); Query q1 = LuceneQueryTranslator.rewrite(bq, Collections.<String>emptySet()); assertEquals(Query.newBooleanQuery(BooleanOp.NOT, ImmutableList.of( Query.newBooleanQuery(BooleanOp.OR, ImmutableList.of( Query.newTermQuery(new Term("f", false, 0, "a")), Query.newTermQuery(new Term("f", false, 0, "b")))) )), q1); } }