2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property.
6 * Copyright © 2017 Amdocs
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License ati
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
22 * ECOMP and OpenECOMP are trademarks
23 * and service marks of AT&T Intellectual Property.
25 package org.openecomp.sa.searchdbabstraction.searchapi;
27 import com.fasterxml.jackson.core.JsonParseException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import org.junit.Test;
31 import org.openecomp.sa.rest.TestUtils;
34 import java.io.IOException;
36 import static org.junit.Assert.*;
38 public class SearchStatementTest {
41 public void simpleQueryTest() throws JsonParseException, JsonMappingException, IOException {
43 String field = "searchTags";
44 String queryString = "aai3255";
48 + "{\"may\": {\"parsed-query\": {"
49 + "\"field\": \"" + field + "\","
50 + "\"query-string\": \"" + queryString + "\"}}}"
57 + "\"version\": true,"
62 + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}"
68 // Marshal our simple query JSON to a SearchStatement object.
69 ObjectMapper mapper = new ObjectMapper();
70 SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class);
72 // We expect to have a search statement with one query.
73 assertEquals("Unexpected number of queries in marshalled result",
74 1, ss.getQueries().length);
76 // Validate that the query is of the expected type and contains the
78 QueryStatement query = ss.getQueries()[0].getQueryStatement();
79 assertNotNull("Expected marshalled statement to contain a 'parsed query'",
80 query.getParsedQuery());
81 assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + query.getParsedQuery().getField(),
82 field.equals(query.getParsedQuery().getField()));
83 assertTrue("Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(),
84 queryString.equals(query.getParsedQuery().getQueryString()));
86 // Validate that we are able to produce the expected ElasticSearch
87 // query syntax from the search statement.
88 assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
89 queryES.equals(ss.toElasticSearch()));
94 public void simpleSortedQueryTest() throws JsonParseException, JsonMappingException, IOException {
96 String field = "searchTags";
97 String queryString = "aai3255";
101 + "{\"may\": {\"parsed-query\": {"
102 + "\"field\": \"" + field + "\","
103 + "\"query-string\": \"" + queryString + "\"}}}"
105 + "\"sort\": { \"field\": \"date\", \"order\": \"ascending\" }"
111 + "\"version\": true,"
116 + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}"
121 + "\"sort\": { \"date\": { \"order\": \"asc\"}}"
124 // Marshal our simple query JSON to a SearchStatement object.
125 ObjectMapper mapper = new ObjectMapper();
126 SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class);
128 // We expect to have a search statement with one query.
129 assertEquals("Unexpected number of queries in marshalled result",
130 1, ss.getQueries().length);
132 // Validate that the query is of the expected type and contains the
134 QueryStatement query = ss.getQueries()[0].getQueryStatement();
135 assertNotNull("Expected marshalled statement to contain a 'parsed query'",
136 query.getParsedQuery());
137 assertTrue("Unexpected field name in marshalled query. Expected: " + field + " Actual: " + query.getParsedQuery().getField(),
138 field.equals(query.getParsedQuery().getField()));
139 assertTrue("Unexpected query string in marshalled query. Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(),
140 queryString.equals(query.getParsedQuery().getQueryString()));
141 System.out.println("GDF: ES = " + ss.toElasticSearch());
142 // Validate that we are able to produce the expected ElasticSearch
143 // query syntax from the search statement.
144 assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
145 queryES.equals(ss.toElasticSearch()));
146 assertNull(ss.getAggregations());
150 public void filteredQueryTest() throws JsonParseException, JsonMappingException, IOException {
152 String filterField1 = "field1";
153 String filterField2 = "field2";
154 String filterField3 = "field3";
155 String filterValue1 = "a";
156 String filterValue2 = "b";
157 String filterValue3 = "string";
158 String filterJson = "{ \"any\": [ "
159 + "{\"match\": {\"field\": \"" + filterField1 + "\", \"value\": \"" + filterValue1 + "\"}},"
160 + "{\"match\": {\"field\": \"" + filterField2 + "\", \"value\": \"" + filterValue2 + "\"}}"
163 + "{\"parsed-query\": {\"field\": \"" + filterField3 + "\", \"query-string\": \"" + filterValue3 + "\"}}"
167 String filterStanzaJson = "\"filter\": " + filterJson;
169 String queryStanzaJson = "\"queries\": [ "
170 + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}},"
171 + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}},"
172 + "{\"may\": {\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}}"
177 + "\"version\": true,"
182 + "{\"term\": {\"searchTags\" : \"a\"}}, "
183 + "{\"term\": {\"searchTags\" : \"b\"}}, "
184 + "{\"query_string\": {\"default_field\": \"fieldname\", \"query\": \"string\"}}"
186 + "\"must_not\": [], "
190 + "{\"query_string\": {\"default_field\": \"field3\", \"query\": \"string\"}}"
192 + "\"must_not\": [],"
194 + "{\"term\": {\"field1\" : \"a\"}}, "
195 + "{\"term\": {\"field2\" : \"b\"}}"
204 StringBuilder sb = new StringBuilder();
206 sb.append(filterStanzaJson).append(", ");
207 sb.append(queryStanzaJson);
210 ObjectMapper mapper = new ObjectMapper();
211 SearchStatement ss = mapper.readValue(sb.toString(), SearchStatement.class);
213 assertEquals("Unexpected number of queries in the 'any' list for this statement's filter",
214 2, ss.getFilter().getAny().length);
215 assertEquals("Unexpected number of queries in the 'all' list for this statement's filter",
216 1, ss.getFilter().getAll().length);
218 assertTrue("Unexpected ElasticSearch syntax. Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
219 queryES.equals(ss.toElasticSearch()));
221 assertNull(ss.getAggregations());
225 public void aggregationTest() {
226 String input = "{\r\n \"queries\": [\r\n {\r\n \"must\": {\r\n \"match\": {\r\n \"field\": \"searchTags\",\r\n \"value\": \"a\"\r\n }\r\n }\r\n }\r\n ],\r\n \"aggregations\": [\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-range\": {\r\n \"field\": \"mydate\",\r\n \"ranges\": [\r\n {\r\n \"from\": \"2016-12-19T00:00:00.738-05:00\",\r\n \"to\": \"2016-12-23T23:59:59.738-05:00\"\r\n }\r\n ]\r\n },\r\n \"sub-aggregations\": [\r\n {\r\n \"name\": \"byTerm\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"myterm\"\r\n }\r\n }\r\n },\r\n {\r\n \"name\": \"byDate\",\r\n \"aggregation\": {\r\n \"date-histogram\": {\r\n \"field\": \"myDate\",\r\n \"interval\": \"myInterval\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"2nd\",\r\n \"aggregation\": {\r\n \"group-by\": {\r\n \"field\": \"anotherTerm\"\r\n }\r\n }\r\n }\r\n ]\r\n}";
228 ObjectMapper mapper = new ObjectMapper();
230 SearchStatement ss = mapper.readValue(input, SearchStatement.class);
231 Aggregation[] aggs = ss.getAggregations();
233 assertEquals("Unexpected number aggregations", 2, aggs.length);
234 assertEquals("byDate", aggs[0].getName());
235 assertNotNull(aggs[0].getStatement().getDateRange());
236 assertEquals("mydate", aggs[0].getStatement().getDateRange().getField());
237 assertNotNull(aggs[0].getStatement().getSubAggregations());
238 assertEquals(2, aggs[0].getStatement().getSubAggregations().length);
239 assertEquals("byTerm", aggs[0].getStatement().getSubAggregations()[0].getName());
240 assertEquals("byDate", aggs[0].getStatement().getSubAggregations()[1].getName());
241 assertNull(aggs[0].getStatement().getGroupBy());
242 assertEquals("2nd", aggs[1].getName());
243 assertNotNull(aggs[1].getStatement().getGroupBy());
244 assertEquals("anotherTerm", aggs[1].getStatement().getGroupBy().getField());
245 assertNull(aggs[1].getStatement().getDateRange());
246 assertNull(aggs[1].getStatement().getSubAggregations());
248 } catch (Exception e) {
249 fail("Encountered exception: " + e.getMessage());
254 public void resultSetRangeTest() throws IOException {
256 // Simple query with a result set subrange specified.
257 File queryWithSubrangeFile = new File("src/test/resources/json/queries/query-with-subrange.json");
258 String queryWithSubrangeStr = TestUtils.readFileToString(queryWithSubrangeFile);
259 String queryWithSubrangeExpectedESString =
260 "{\"version\": true,\"from\": 0, \"size\": 10, \"query\": {\"bool\": {\"must\": [{\"term\": {\"field1\" : \"Bob\"}}], \"should\": [],\"must_not\": []}}}";
262 ObjectMapper mapper = new ObjectMapper();
263 SearchStatement ss = mapper.readValue(queryWithSubrangeStr, SearchStatement.class);
265 assertEquals("Unexpected index for result set start", ss.getFrom(), (Integer) 0);
266 assertEquals("Unexpected value for result set size", ss.getSize(), (Integer) 10);
267 assertTrue("Unexpected elastic search query generated from search statement",
268 ss.toElasticSearch().equals(queryWithSubrangeExpectedESString));