Renaming openecomp to onap
[aai/search-data-service.git] / src / test / java / org / onap / aai / sa / searchdbabstraction / searchapi / SearchStatementTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23 package org.onap.aai.sa.searchdbabstraction.searchapi;
24
25 import com.fasterxml.jackson.core.JsonParseException;
26 import com.fasterxml.jackson.databind.JsonMappingException;
27 import com.fasterxml.jackson.databind.ObjectMapper;
28 import org.junit.Test;
29 import org.onap.aai.sa.rest.TestUtils;
30 import org.onap.aai.sa.searchdbabstraction.searchapi.Aggregation;
31 import org.onap.aai.sa.searchdbabstraction.searchapi.QueryStatement;
32 import org.onap.aai.sa.searchdbabstraction.searchapi.SearchStatement;
33
34 import java.io.File;
35 import java.io.IOException;
36
37 import static org.junit.Assert.*;
38
39 public class SearchStatementTest {
40
41   @Test
42   public void simpleQueryTest() throws JsonParseException, JsonMappingException, IOException {
43
44     String field = "searchTags";
45     String queryString = "aai3255";
46     String queryJson =
47         "{"
48             + "\"queries\": ["
49             + "{\"may\": {\"parsed-query\": {"
50             + "\"field\": \"" + field + "\","
51             + "\"query-string\": \"" + queryString + "\"}}}"
52             + "]"
53             + "}"
54             + "}";
55
56     String queryES =
57         "{"
58             + "\"version\": true,"
59             + "\"query\": {"
60             + "\"bool\": {"
61             + "\"must\": [], "
62             + "\"should\": ["
63             + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}"
64             + "],"
65             + "\"must_not\": []}"
66             + "}"
67             + "}";
68
69     // Marshal our simple query JSON to a SearchStatement object.
70     ObjectMapper mapper = new ObjectMapper();
71     SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class);
72
73     // We expect to have a search statement with one query.
74     assertEquals("Unexpected number of queries in marshalled result",
75         1, ss.getQueries().length);
76
77     // Validate that the query is of the expected type and contains the
78     // expected values.
79     QueryStatement query = ss.getQueries()[0].getQueryStatement();
80     assertNotNull("Expected marshalled statement to contain a 'parsed query'",
81         query.getParsedQuery());
82     assertTrue("Unexpected field name in marshalled query.  Expected: " + field + " Actual: " + query.getParsedQuery().getField(),
83         field.equals(query.getParsedQuery().getField()));
84     assertTrue("Unexpected query string in marshalled query.  Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(),
85         queryString.equals(query.getParsedQuery().getQueryString()));
86
87     // Validate that we are able to produce the expected ElasticSearch
88     // query syntax from the search statement.
89     assertTrue("Unexpected ElasticSearch syntax.  Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
90         queryES.equals(ss.toElasticSearch()));
91   }
92
93
94   @Test
95   public void simpleSortedQueryTest() throws JsonParseException, JsonMappingException, IOException {
96
97     String field = "searchTags";
98     String queryString = "aai3255";
99     String queryJson =
100         "{"
101             + "\"queries\": ["
102             + "{\"may\": {\"parsed-query\": {"
103             + "\"field\": \"" + field + "\","
104             + "\"query-string\": \"" + queryString + "\"}}}"
105             + "],"
106             + "\"sort\": { \"field\": \"date\", \"order\": \"ascending\" }"
107             + "}";
108
109
110     String queryES =
111         "{"
112             + "\"version\": true,"
113             + "\"query\": {"
114             + "\"bool\": {"
115             + "\"must\": [], "
116             + "\"should\": ["
117             + "{\"query_string\": {\"default_field\": \"searchTags\", \"query\": \"aai3255\"}}"
118             + "],"
119             + "\"must_not\": []"
120             + "}"
121             + "}, "
122             + "\"sort\": { \"date\": { \"order\": \"asc\"}}"
123             + "}";
124
125     // Marshal our simple query JSON to a SearchStatement object.
126     ObjectMapper mapper = new ObjectMapper();
127     SearchStatement ss = mapper.readValue(queryJson, SearchStatement.class);
128
129     // We expect to have a search statement with one query.
130     assertEquals("Unexpected number of queries in marshalled result",
131         1, ss.getQueries().length);
132
133     // Validate that the query is of the expected type and contains the
134     // expected values.
135     QueryStatement query = ss.getQueries()[0].getQueryStatement();
136     assertNotNull("Expected marshalled statement to contain a 'parsed query'",
137         query.getParsedQuery());
138     assertTrue("Unexpected field name in marshalled query.  Expected: " + field + " Actual: " + query.getParsedQuery().getField(),
139         field.equals(query.getParsedQuery().getField()));
140     assertTrue("Unexpected query string in marshalled query.  Expected: " + queryString + " Actual: " + query.getParsedQuery().getQueryString(),
141         queryString.equals(query.getParsedQuery().getQueryString()));
142     System.out.println("GDF: ES = " + ss.toElasticSearch());
143     // Validate that we are able to produce the expected ElasticSearch
144     // query syntax from the search statement.
145     assertTrue("Unexpected ElasticSearch syntax.  Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
146         queryES.equals(ss.toElasticSearch()));
147     assertNull(ss.getAggregations());
148   }
149
150   @Test
151   public void filteredQueryTest() throws JsonParseException, JsonMappingException, IOException {
152
153     String filterField1 = "field1";
154     String filterField2 = "field2";
155     String filterField3 = "field3";
156     String filterValue1 = "a";
157     String filterValue2 = "b";
158     String filterValue3 = "string";
159     String filterJson = "{ \"any\": [ "
160         + "{\"match\": {\"field\": \"" + filterField1 + "\", \"value\": \"" + filterValue1 + "\"}},"
161         + "{\"match\": {\"field\": \"" + filterField2 + "\", \"value\": \"" + filterValue2 + "\"}}"
162         + "],"
163         + "\"all\": ["
164         + "{\"parsed-query\": {\"field\": \"" + filterField3 + "\", \"query-string\": \"" + filterValue3 + "\"}}"
165         + "]"
166         + "}";
167
168     String filterStanzaJson = "\"filter\": " + filterJson;
169
170     String queryStanzaJson = "\"queries\": [ "
171         + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"a\"}}},"
172         + "{\"may\": {\"match\": {\"field\": \"searchTags\", \"value\": \"b\"}}},"
173         + "{\"may\": {\"parsed-query\": {\"field\": \"fieldname\", \"query-string\": \"string\"}}}"
174         + "]";
175
176     String queryES =
177         "{"
178             + "\"version\": true,"
179             + "\"query\": {"
180             + "\"bool\": {"
181             + "\"must\": [], "
182             + "\"should\": ["
183             + "{\"term\": {\"searchTags\" : \"a\"}}, "
184             + "{\"term\": {\"searchTags\" : \"b\"}}, "
185             + "{\"query_string\": {\"default_field\": \"fieldname\", \"query\": \"string\"}}"
186             + "],"
187             + "\"must_not\": [], "
188             + "\"filter\": {"
189             + "\"bool\": {"
190             + "\"must\": ["
191             + "{\"query_string\": {\"default_field\": \"field3\", \"query\": \"string\"}}"
192             + "],"
193             + "\"must_not\": [],"
194             + "\"should\": ["
195             + "{\"term\": {\"field1\" : \"a\"}}, "
196             + "{\"term\": {\"field2\" : \"b\"}}"
197             + "],"
198             + "\"must_not\": []"
199             + "}"
200             + "}"
201             + "}"
202             + "}"
203             + "}";
204
205     StringBuilder sb = new StringBuilder();
206     sb.append("{");
207     sb.append(filterStanzaJson).append(", ");
208     sb.append(queryStanzaJson);
209     sb.append("}");
210
211     ObjectMapper mapper = new ObjectMapper();
212     SearchStatement ss = mapper.readValue(sb.toString(), SearchStatement.class);
213
214     assertEquals("Unexpected number of queries in the 'any' list for this statement's filter",
215         2, ss.getFilter().getAny().length);
216     assertEquals("Unexpected number of queries in the 'all' list for this statement's filter",
217         1, ss.getFilter().getAll().length);
218
219     assertTrue("Unexpected ElasticSearch syntax.  Expected: " + queryES + " Actual: " + ss.toElasticSearch(),
220         queryES.equals(ss.toElasticSearch()));
221
222     assertNull(ss.getAggregations());
223   }
224
225   @Test
226   public void aggregationTest() {
227     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
229     ObjectMapper mapper = new ObjectMapper();
230     try {
231       SearchStatement ss = mapper.readValue(input, SearchStatement.class);
232       Aggregation[] aggs = ss.getAggregations();
233       assertNotNull(aggs);
234       assertEquals("Unexpected number aggregations", 2, aggs.length);
235       assertEquals("byDate", aggs[0].getName());
236       assertNotNull(aggs[0].getStatement().getDateRange());
237       assertEquals("mydate", aggs[0].getStatement().getDateRange().getField());
238       assertNotNull(aggs[0].getStatement().getSubAggregations());
239       assertEquals(2, aggs[0].getStatement().getSubAggregations().length);
240       assertEquals("byTerm", aggs[0].getStatement().getSubAggregations()[0].getName());
241       assertEquals("byDate", aggs[0].getStatement().getSubAggregations()[1].getName());
242       assertNull(aggs[0].getStatement().getGroupBy());
243       assertEquals("2nd", aggs[1].getName());
244       assertNotNull(aggs[1].getStatement().getGroupBy());
245       assertEquals("anotherTerm", aggs[1].getStatement().getGroupBy().getField());
246       assertNull(aggs[1].getStatement().getDateRange());
247       assertNull(aggs[1].getStatement().getSubAggregations());
248
249     } catch (Exception e) {
250       fail("Encountered exception: " + e.getMessage());
251     }
252   }
253
254   @Test
255   public void resultSetRangeTest() throws IOException {
256
257     // Simple query with a result set subrange specified.
258     File queryWithSubrangeFile = new File("src/test/resources/json/queries/query-with-subrange.json");
259     String queryWithSubrangeStr = TestUtils.readFileToString(queryWithSubrangeFile);
260     String queryWithSubrangeExpectedESString =
261         "{\"version\": true,\"from\": 0, \"size\": 10, \"query\": {\"bool\": {\"must\": [{\"term\": {\"field1\" : \"Bob\"}}], \"should\": [],\"must_not\": []}}}";
262
263     ObjectMapper mapper = new ObjectMapper();
264     SearchStatement ss = mapper.readValue(queryWithSubrangeStr, SearchStatement.class);
265
266     assertEquals("Unexpected index for result set start", ss.getFrom(), (Integer) 0);
267     assertEquals("Unexpected value for result set size", ss.getSize(), (Integer) 10);
268     assertTrue("Unexpected elastic search query generated from search statement",
269         ss.toElasticSearch().equals(queryWithSubrangeExpectedESString));
270   }
271 }