/* * Copyright (c) 2016 Couchbase, 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.couchbase.client.java.search.queries; import static org.junit.Assert.assertEquals; import com.couchbase.client.java.document.json.JsonArray; import com.couchbase.client.java.document.json.JsonObject; import com.couchbase.client.java.search.SearchQuery; import org.junit.Test; public class BooleanQueryTest { @Test(expected = IllegalArgumentException.class) public void shouldFailExportWhenNoChild() { new SearchQuery("foo", SearchQuery.booleans()).export(); } @Test public void shouldExportBooleanQueryWithInnerBoosts() { PrefixQuery inner = SearchQuery.prefix("someterm").boost(2); BooleanQuery fts = SearchQuery.booleans().must(inner).mustNot(inner).should(inner); SearchQuery query = new SearchQuery("foo", fts); JsonObject expectedInner = JsonObject.create().put("prefix", "someterm").put("boost", 2.0); JsonObject expectedMustNot = JsonObject.create().put("disjuncts", JsonArray.from(expectedInner)); JsonObject expectedShould = JsonObject.create().put("disjuncts", JsonArray.from(expectedInner)); JsonObject expectedMust = JsonObject.create().put("conjuncts", JsonArray.from(expectedInner)); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("must", expectedMust) .put("must_not", expectedMustNot) .put("should", expectedShould)); assertEquals(expected, query.export()); } @Test public void shouldCumulateCallsToMust() { PrefixQuery inner1 = SearchQuery.prefix("someterm").boost(2); PrefixQuery inner2 = SearchQuery.prefix("otherterm"); BooleanQuery fts = SearchQuery.booleans().must(inner1).must(inner2); SearchQuery query = new SearchQuery("foo", fts); JsonObject expectedInner1 = JsonObject.create().put("prefix", "someterm").put("boost", 2.0); JsonObject expectedInner2 = JsonObject.create().put("prefix", "otherterm"); JsonObject expectedMust = JsonObject.create().put("conjuncts", JsonArray.from(expectedInner1, expectedInner2)); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("must", expectedMust)); assertEquals(expected, query.export()); } @Test public void shouldCumulateCallsToMustNot() { PrefixQuery inner1 = SearchQuery.prefix("someterm").boost(2); PrefixQuery inner2 = SearchQuery.prefix("otherterm"); BooleanQuery fts = SearchQuery.booleans().mustNot(inner1).mustNot(inner2); SearchQuery query = new SearchQuery("foo", fts); JsonObject expectedInner1 = JsonObject.create().put("prefix", "someterm").put("boost", 2.0); JsonObject expectedInner2 = JsonObject.create().put("prefix", "otherterm"); JsonObject expectedMustNot = JsonObject.create().put("disjuncts", JsonArray.from(expectedInner1, expectedInner2)); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("must_not", expectedMustNot)); assertEquals(expected, query.export()); } @Test public void shouldCumulateCallsToShould() { PrefixQuery inner1 = SearchQuery.prefix("someterm").boost(2); PrefixQuery inner2 = SearchQuery.prefix("otherterm"); BooleanQuery fts = SearchQuery.booleans().should(inner1).should(inner2); SearchQuery query = new SearchQuery("foo", fts); JsonObject expectedInner1 = JsonObject.create().put("prefix", "someterm").put("boost", 2.0); JsonObject expectedInner2 = JsonObject.create().put("prefix", "otherterm"); JsonObject expectedMust = JsonObject.create().put("disjuncts", JsonArray.from(expectedInner1, expectedInner2)); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("should", expectedMust)); assertEquals(expected, query.export()); } @Test public void shouldUseMinForShould() { PrefixQuery inner = SearchQuery.prefix("someterm").boost(2); BooleanQuery fts = SearchQuery.booleans().must(inner).mustNot(inner).should(inner, inner).shouldMin(2); SearchQuery query = new SearchQuery("foo", fts); JsonObject expectedInner = JsonObject.create().put("prefix", "someterm").put("boost", 2.0); //default min from a disjunction query is omitted JsonObject expectedMustNot = JsonObject.create().put("disjuncts", JsonArray.from(expectedInner)); JsonObject expectedShould = JsonObject.create() .put("disjuncts", JsonArray.from(expectedInner, expectedInner)) //minShould sets the "should" section's min .put("min", 2); JsonObject expectedMust = JsonObject.create().put("conjuncts", JsonArray.from(expectedInner)); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("must", expectedMust) .put("must_not", expectedMustNot) .put("should", expectedShould)); assertEquals(expected, query.export()); } @Test(expected = IllegalArgumentException.class) public void shouldFailOnShouldSectionTooSmall() { PrefixQuery inner = SearchQuery.prefix("someterm").boost(2); BooleanQuery fts = SearchQuery.booleans().should(inner).shouldMin(2); SearchQuery query = new SearchQuery("foo", fts); query.export(); } @Test public void shouldExportBooleanQueryWithAllOptions() { PrefixQuery innerA = SearchQuery.prefix("someterm").boost(2.0); PrefixQuery innerB = SearchQuery.prefix("termB"); PrefixQuery innerC = SearchQuery.prefix("termC"); BooleanQuery fts = SearchQuery.booleans() .boost(1.5) .must(innerA) .mustNot(innerB) .should(innerA, innerB, innerC) .shouldMin(3); SearchQuery query = new SearchQuery("foo", fts) .explain(); JsonObject expectedInnerA = JsonObject.create().put("prefix", "someterm").put("boost", 2d); JsonObject expectedInnerB = JsonObject.create().put("prefix", "termB"); JsonObject expectedInnerC = JsonObject.create().put("prefix", "termC"); JsonObject expectedMust = JsonObject.create().put("conjuncts", JsonArray.from(expectedInnerA)); JsonObject expectedMustNot = JsonObject.create() .put("disjuncts", JsonArray.from(expectedInnerB)); JsonObject expectedShould = JsonObject.create() .put("disjuncts", JsonArray.from(expectedInnerA, expectedInnerB, expectedInnerC)) .put("min", 3); JsonObject expected = JsonObject.create() .put("query", JsonObject.create() .put("boost", 1.5) .put("must", expectedMust) .put("must_not", expectedMustNot) .put("should", expectedShould)) .put("explain", true); assertEquals(expected, query.export()); } }