blob: ebd0243432412c3b75e04d899f1cd052cf354230 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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 org.apache.doris.external.elasticsearch;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.doris.external.elasticsearch.QueryBuilders;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Check that internal queries are correctly converted to ES search query (as JSON)
*/
public class QueryBuildersTest {
private final ObjectMapper mapper = new ObjectMapper();
@Test
public void testTermQuery() throws Exception {
assertEquals("{\"term\":{\"k\":\"aaaa\"}}",
toJson(QueryBuilders.termQuery("k", "aaaa")));
assertEquals("{\"term\":{\"aaaa\":\"k\"}}",
toJson(QueryBuilders.termQuery("aaaa", "k")));
assertEquals("{\"term\":{\"k\":0}}",
toJson(QueryBuilders.termQuery("k", (byte) 0)));
assertEquals("{\"term\":{\"k\":123}}",
toJson(QueryBuilders.termQuery("k", (long) 123)));
assertEquals("{\"term\":{\"k\":41}}",
toJson(QueryBuilders.termQuery("k", (short) 41)));
assertEquals("{\"term\":{\"k\":128}}",
toJson(QueryBuilders.termQuery("k", 128)));
assertEquals("{\"term\":{\"k\":42.42}}",
toJson(QueryBuilders.termQuery("k", 42.42D)));
assertEquals("{\"term\":{\"k\":1.1}}",
toJson(QueryBuilders.termQuery("k", 1.1F)));
assertEquals("{\"term\":{\"k\":1}}",
toJson(QueryBuilders.termQuery("k", new BigDecimal(1))));
assertEquals("{\"term\":{\"k\":121}}",
toJson(QueryBuilders.termQuery("k", new BigInteger("121"))));
assertEquals("{\"term\":{\"k\":true}}",
toJson(QueryBuilders.termQuery("k", new AtomicBoolean(true))));
}
@Test
public void testTermsQuery() throws Exception {
assertEquals("{\"terms\":{\"k\":[]}}",
toJson(QueryBuilders.termsQuery("k", Collections.emptySet())));
assertEquals("{\"terms\":{\"k\":[0]}}",
toJson(QueryBuilders.termsQuery("k", Collections.singleton(0))));
assertEquals("{\"terms\":{\"k\":[\"aaa\"]}}",
toJson(QueryBuilders.termsQuery("k", Collections.singleton("aaa"))));
assertEquals("{\"terms\":{\"k\":[\"aaa\",\"bbb\",\"ccc\"]}}",
toJson(QueryBuilders.termsQuery("k", Arrays.asList("aaa", "bbb", "ccc"))));
assertEquals("{\"terms\":{\"k\":[1,2,3]}}",
toJson(QueryBuilders.termsQuery("k", Arrays.asList(1, 2, 3))));
assertEquals("{\"terms\":{\"k\":[1.1,2.2,3.3]}}",
toJson(QueryBuilders.termsQuery("k", Arrays.asList(1.1f, 2.2f, 3.3f))));
assertEquals("{\"terms\":{\"k\":[1.1,2.2,3.3]}}",
toJson(QueryBuilders.termsQuery("k", Arrays.asList(1.1d, 2.2d, 3.3d))));
}
@Test
public void testBoolQuery() throws Exception {
QueryBuilders.QueryBuilder q1 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("k", "aaa"));
assertEquals("{\"bool\":{\"must\":{\"term\":{\"k\":\"aaa\"}}}}",
toJson(q1));
QueryBuilders.QueryBuilder q2 = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("k1", "aaa")).must(QueryBuilders.termQuery("k2", "bbb"));
assertEquals("{\"bool\":{\"must\":[{\"term\":{\"k1\":\"aaa\"}},{\"term\":{\"k2\":\"bbb\"}}]}}",
toJson(q2));
QueryBuilders.QueryBuilder q3 = QueryBuilders.boolQuery()
.mustNot(QueryBuilders.termQuery("k", "fff"));
assertEquals("{\"bool\":{\"must_not\":{\"term\":{\"k\":\"fff\"}}}}",
toJson(q3));
QueryBuilders.QueryBuilder q4 = QueryBuilders.rangeQuery("k1").lt(200).gt(-200);
QueryBuilders.QueryBuilder q5 = QueryBuilders.termsQuery("k2", Arrays.asList("aaa", "bbb", "ccc"));
QueryBuilders.QueryBuilder q6 = QueryBuilders.boolQuery().must(q4).should(q5);
assertEquals("{\"bool\":{\"must\":{\"range\":{\"k1\":{\"gt\":-200,\"lt\":200}}},\"should\":{\"terms\":{\"k2\":[\"aaa\",\"bbb\",\"ccc\"]}}}}", toJson(q6));
assertEquals("{\"bool\":{\"filter\":[{\"range\":{\"k1\":{\"gt\":-200,\"lt\":200}}},{\"terms\":{\"k2\":[\"aaa\",\"bbb\",\"ccc\"]}}]}}", toJson(QueryBuilders.boolQuery().filter(q4).filter(q5)));
assertEquals("{\"bool\":{\"filter\":{\"range\":{\"k1\":{\"gt\":-200,\"lt\":200}}},\"must_not\":{\"terms\":{\"k2\":[\"aaa\",\"bbb\",\"ccc\"]}}}}", toJson(QueryBuilders.boolQuery().filter(q4).mustNot(q5)));
}
@Test
public void testExistsQuery() throws Exception {
assertEquals("{\"exists\":{\"field\":\"k\"}}",
toJson(QueryBuilders.existsQuery("k")));
}
@Test
public void testRangeQuery() throws Exception {
assertEquals("{\"range\":{\"k\":{\"lt\":123}}}",
toJson(QueryBuilders.rangeQuery("k").lt(123)));
assertEquals("{\"range\":{\"k\":{\"gt\":123}}}",
toJson(QueryBuilders.rangeQuery("k").gt(123)));
assertEquals("{\"range\":{\"k\":{\"gte\":12345678}}}",
toJson(QueryBuilders.rangeQuery("k").gte(12345678)));
assertEquals("{\"range\":{\"k\":{\"lte\":12345678}}}",
toJson(QueryBuilders.rangeQuery("k").lte(12345678)));
assertEquals("{\"range\":{\"k\":{\"gt\":123,\"lt\":345}}}",
toJson(QueryBuilders.rangeQuery("k").gt(123).lt(345)));
assertEquals("{\"range\":{\"k\":{\"gt\":-456.6,\"lt\":12.3}}}",
toJson(QueryBuilders.rangeQuery("k").lt(12.3f).gt(-456.6f)));
assertEquals("{\"range\":{\"k\":{\"gt\":6789.33,\"lte\":9999.99}}}",
toJson(QueryBuilders.rangeQuery("k").gt(6789.33f).lte(9999.99f)));
assertEquals("{\"range\":{\"k\":{\"gte\":1,\"lte\":\"zzz\"}}}",
toJson(QueryBuilders.rangeQuery("k").gte(1).lte("zzz")));
assertEquals("{\"range\":{\"k\":{\"gte\":\"zzz\"}}}",
toJson(QueryBuilders.rangeQuery("k").gte("zzz")));
assertEquals("{\"range\":{\"k\":{\"gt\":\"aaa\",\"lt\":\"zzz\"}}}",
toJson(QueryBuilders.rangeQuery("k").gt("aaa").lt("zzz")));
}
@Test
public void testMatchAllQuery() throws IOException {
assertEquals("{\"match_all\":{}}",
toJson(QueryBuilders.matchAllQuery()));
}
@Test
public void testWildCardQuery() throws IOException {
assertEquals("{\"wildcard\":{\"k1\":\"?aa*\"}}",
toJson(QueryBuilders.wildcardQuery("k1", "?aa*")));
}
private String toJson(QueryBuilders.QueryBuilder builder) throws IOException {
StringWriter writer = new StringWriter();
JsonGenerator gen = mapper.getFactory().createGenerator(writer);
builder.toJson(gen);
gen.flush();
gen.close();
return writer.toString();
}
}