Skip to content
This repository was archived by the owner on Aug 2, 2022. It is now read-only.

Commit 90d77a6

Browse files
authored
Integ migration (#77)
* migrate NestedFieldQuery, QueryFunctions, SourceField to gradle
1 parent 8f8e1b0 commit 90d77a6

File tree

5 files changed

+172
-181
lines changed

5 files changed

+172
-181
lines changed

src/test/java/com/amazon/opendistroforelasticsearch/sql/intgtest/NestedFieldQueryTest.java renamed to src/test/java/com/amazon/opendistroforelasticsearch/sql/esintgtest/NestedFieldQueryIT.java

+107-133
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,33 @@
1313
* permissions and limitations under the License.
1414
*/
1515

16-
package com.amazon.opendistroforelasticsearch.sql.intgtest;
16+
package com.amazon.opendistroforelasticsearch.sql.esintgtest;
1717

18-
import com.amazon.opendistroforelasticsearch.sql.exception.SqlParseException;
19-
import com.amazon.opendistroforelasticsearch.sql.plugin.SearchDao;
20-
import com.amazon.opendistroforelasticsearch.sql.query.SqlElasticRequestBuilder;
18+
import com.amazon.opendistroforelasticsearch.sql.intgtest.TestsConstants;
2119
import org.elasticsearch.action.search.SearchResponse;
20+
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
21+
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
22+
import org.elasticsearch.common.xcontent.XContentFactory;
23+
import org.elasticsearch.common.xcontent.XContentParser;
24+
import org.elasticsearch.common.xcontent.XContentType;
2225
import org.elasticsearch.search.SearchHit;
23-
import org.elasticsearch.search.aggregations.Aggregation;
24-
import org.elasticsearch.search.aggregations.Aggregations;
25-
import org.elasticsearch.search.aggregations.bucket.nested.InternalNested;
26-
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
27-
import org.elasticsearch.search.aggregations.metrics.Avg;
28-
import org.elasticsearch.search.aggregations.metrics.Sum;
29-
import org.elasticsearch.search.aggregations.metrics.ValueCount;
3026
import org.hamcrest.BaseMatcher;
3127
import org.hamcrest.Description;
3228
import org.hamcrest.FeatureMatcher;
3329
import org.hamcrest.Matcher;
30+
import org.json.JSONArray;
31+
import org.json.JSONObject;
32+
import org.junit.Assert;
3433
import org.junit.Test;
3534

36-
import java.sql.SQLFeatureNotSupportedException;
35+
import java.io.IOException;
3736
import java.util.ArrayList;
3837
import java.util.function.Function;
3938

40-
import static org.hamcrest.MatcherAssert.assertThat;
4139
import static org.hamcrest.Matchers.allOf;
4240
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
4341
import static org.hamcrest.Matchers.closeTo;
44-
import static org.hamcrest.Matchers.containsInAnyOrder;
42+
import static org.hamcrest.Matchers.equalTo;
4543
import static org.hamcrest.Matchers.is;
4644

4745
/**
@@ -62,21 +60,26 @@
6260
* 5) HAVING
6361
* 6) Verification for conditions mixed with regular and nested fields
6462
*/
65-
public class NestedFieldQueryTest {
63+
public class NestedFieldQueryIT extends SQLIntegTestCase {
6664

6765
private static final String FROM = "FROM " + TestsConstants.TEST_INDEX_NESTED_TYPE + "/nestedType n, n.message m";
6866

67+
@Override
68+
protected void init() throws Exception {
69+
loadIndex(Index.NESTED);
70+
}
71+
6972
@Test
70-
public void selectAll() {
73+
public void selectAll() throws IOException {
7174
queryAll("SELECT *");
7275
}
7376

7477
@Test
75-
public void noCondition() {
78+
public void noCondition() throws IOException {
7679
queryAll("SELECT myNum, someField, m.author, m.info");
7780
}
7881

79-
private void queryAll(String sql) {
82+
private void queryAll(String sql) throws IOException {
8083
assertThat(
8184
query(sql),
8285
hits(
@@ -139,7 +142,7 @@ private void queryAll(String sql) {
139142
}
140143

141144
@Test
142-
public void singleCondition() {
145+
public void singleCondition() throws IOException {
143146
assertThat(
144147
query(
145148
"SELECT myNum, m.author, m.info",
@@ -169,7 +172,7 @@ public void singleCondition() {
169172
}
170173

171174
@Test
172-
public void multipleConditionsOfNestedField() {
175+
public void multipleConditionsOfNestedField() throws IOException {
173176
assertThat(
174177
query(
175178
"SELECT someField, m.author, m.info",
@@ -190,7 +193,7 @@ public void multipleConditionsOfNestedField() {
190193
}
191194

192195
@Test
193-
public void multipleConditionsOfNestedFieldNoMatch() {
196+
public void multipleConditionsOfNestedFieldNoMatch() throws IOException {
194197
assertThat(
195198
query(
196199
"SELECT someField, m.author, m.info",
@@ -201,7 +204,7 @@ public void multipleConditionsOfNestedFieldNoMatch() {
201204
}
202205

203206
@Test
204-
public void multipleConditionsOfRegularAndNestedField() {
207+
public void multipleConditionsOfRegularAndNestedField() throws IOException {
205208
assertThat(
206209
query(
207210
"SELECT myNum, m.author, m.info",
@@ -222,7 +225,7 @@ public void multipleConditionsOfRegularAndNestedField() {
222225
}
223226

224227
@Test
225-
public void multipleConditionsOfRegularOrNestedField() {
228+
public void multipleConditionsOfRegularOrNestedField() throws IOException {
226229
assertThat(
227230
query(
228231
"SELECT myNum, m.author, m.info",
@@ -255,46 +258,54 @@ public void multipleConditionsOfRegularOrNestedField() {
255258
}
256259

257260
@Test
258-
public void aggregationWithoutGroupBy() {
259-
SearchResponse resp = query("SELECT AVG(m.dayOfWeek) AS avgDay");
260-
Avg avgDay = getNestedAgg(resp, "message.dayOfWeek", "avgDay");
261-
assertThat(avgDay.getValue(), isCloseTo(3.166666666));
261+
public void aggregationWithoutGroupBy() throws IOException {
262+
String sql = "SELECT AVG(m.dayOfWeek) AS avgDay " + FROM;
263+
264+
JSONObject result = executeQuery(sql);
265+
JSONObject aggregation = getAggregation(result, "message.dayOfWeek@NESTED");
266+
267+
Assert.assertThat((Double) aggregation.query("/avgDay/value"), closeTo(3.166666666, 0.01));
262268
}
263269

264270
@Test
265-
public void groupByNestedFieldAndCount() {
266-
SearchResponse resp = query(
267-
"SELECT m.info, COUNT(*)", "GROUP BY m.info"
268-
);
269-
assertThat(
270-
getNestedAgg(resp, "message.info", "message.info"),
271-
buckets(
272-
bucket("a", count(equalTo(2))),
273-
bucket("c", count(equalTo(2))),
274-
bucket("b", count(equalTo(1))),
275-
bucket("zz", count(equalTo(1)))
276-
)
277-
);
271+
public void groupByNestedFieldAndCount() throws IOException {
272+
final String sql = "SELECT m.info, COUNT(*) " + FROM + " GROUP BY m.info";
273+
274+
JSONObject result = executeQuery(sql);
275+
JSONObject aggregation = getAggregation(result, "message.info@NESTED");
276+
JSONArray msgInfoBuckets = (JSONArray)aggregation.optQuery("/message.info/buckets");
277+
278+
Assert.assertNotNull(msgInfoBuckets);
279+
Assert.assertThat(msgInfoBuckets.length(), equalTo(4));
280+
Assert.assertThat(msgInfoBuckets.query("/0/key"), equalTo("a"));
281+
Assert.assertThat(msgInfoBuckets.query("/0/COUNT(*)/value"), equalTo(2));
282+
Assert.assertThat(msgInfoBuckets.query("/1/key"), equalTo("c"));
283+
Assert.assertThat(msgInfoBuckets.query("/1/COUNT(*)/value"), equalTo(2));
284+
Assert.assertThat(msgInfoBuckets.query("/2/key"), equalTo("b"));
285+
Assert.assertThat(msgInfoBuckets.query("/2/COUNT(*)/value"), equalTo(1));
286+
Assert.assertThat(msgInfoBuckets.query("/3/key"), equalTo("zz"));
287+
Assert.assertThat(msgInfoBuckets.query("/3/COUNT(*)/value"), equalTo(1));
278288
}
279289

280290
@Test
281-
public void groupByRegularFieldAndSum() {
282-
SearchResponse resp = query(
283-
"SELECT *, SUM(m.dayOfWeek) AS sumDay",
284-
"GROUP BY someField"
285-
);
286-
assertThat(
287-
getAgg(resp, "someField"),
288-
buckets(
289-
bucket("a", sum("message.dayOfWeek", "sumDay", isCloseTo(9.0))),
290-
bucket("b", sum("message.dayOfWeek", "sumDay", isCloseTo(10.0)))
291-
)
292-
);
291+
public void groupByRegularFieldAndSum() throws IOException {
292+
final String sql = "SELECT *, SUM(m.dayOfWeek) AS sumDay " + FROM + " GROUP BY someField";
293+
294+
JSONObject result = executeQuery(sql);
295+
JSONObject aggregation = getAggregation(result, "someField");
296+
JSONArray msgInfoBuckets = (JSONArray)aggregation.optQuery("/buckets");
297+
298+
Assert.assertNotNull(msgInfoBuckets);
299+
Assert.assertThat(msgInfoBuckets.length(), equalTo(2));
300+
Assert.assertThat(msgInfoBuckets.query("/0/key"), equalTo("a"));
301+
Assert.assertThat((Double) msgInfoBuckets.query("/0/message.dayOfWeek@NESTED/sumDay/value"), closeTo(9.0, 0.01));
302+
Assert.assertThat(msgInfoBuckets.query("/1/key"), equalTo("b"));
303+
Assert.assertThat((Double) msgInfoBuckets.query("/1/message.dayOfWeek@NESTED/sumDay/value"), closeTo(10.0, 0.01));
293304
}
294305

295306
// Doesn't support: aggregate function other than COUNT()
296307
@SuppressWarnings("unused")
297-
public void groupByNestedFieldAndAvg() {
308+
public void groupByNestedFieldAndAvg() throws IOException {
298309
query(
299310
"SELECT m.info, AVG(m.dayOfWeek)",
300311
"GROUP BY m.info"
@@ -306,33 +317,31 @@ public void groupByNestedFieldAndAvg() {
306317
}
307318

308319
@Test
309-
public void groupByNestedAndRegularField() {
310-
SearchResponse resp = query(
311-
"SELECT someField, m.info, COUNT(*)",
312-
"GROUP BY someField, m.info"
313-
);
314-
Terms agg = getAgg(resp, "someField");
315-
assertThat(
316-
getNestedAgg(agg.getBucketByKey("a").getAggregations(), "message.info", "message.info"),
317-
buckets(
318-
bucket("b", count(equalTo(1))),
319-
bucket("c", count(equalTo(1))),
320-
bucket("zz", count(equalTo(1)))
321-
)
322-
);
323-
assertThat(
324-
getNestedAgg(agg.getBucketByKey("b").getAggregations(), "message.info", "message.info"),
325-
buckets(
326-
bucket("a", count(equalTo(2))),
327-
bucket("c", count(equalTo(1)))
328-
)
329-
);
320+
public void groupByNestedAndRegularField() throws IOException {
321+
final String sql = "SELECT someField, m.info, COUNT(*) " + FROM + " GROUP BY someField, m.info";
322+
323+
JSONObject result = executeQuery(sql);
324+
JSONObject aggregation = getAggregation(result, "someField");
325+
JSONArray msgInfoBuckets = (JSONArray)aggregation.optQuery("/buckets");
326+
327+
Assert.assertNotNull(msgInfoBuckets);
328+
Assert.assertThat(msgInfoBuckets.length(), equalTo(2));
329+
Assert.assertThat(msgInfoBuckets.query("/0/key"), equalTo("a"));
330+
Assert.assertThat(msgInfoBuckets.query("/1/key"), equalTo("b"));
330331

331-
//doesn't support: group by nested field first
332-
/*query(
333-
"SELECT *, SUM(m.dayOfWeek)",
334-
"GROUP BY m.author, someField"
335-
);*/
332+
JSONArray innerBuckets = (JSONArray)msgInfoBuckets.optQuery("/0/message.info@NESTED/message.info/buckets");
333+
Assert.assertThat(innerBuckets.query("/0/key"), equalTo("b"));
334+
Assert.assertThat(innerBuckets.query("/0/COUNT(*)/value"), equalTo(1));
335+
Assert.assertThat(innerBuckets.query("/1/key"), equalTo("c"));
336+
Assert.assertThat(innerBuckets.query("/1/COUNT(*)/value"), equalTo(1));
337+
Assert.assertThat(innerBuckets.query("/2/key"), equalTo("zz"));
338+
Assert.assertThat(innerBuckets.query("/2/COUNT(*)/value"), equalTo(1));
339+
340+
innerBuckets = (JSONArray)msgInfoBuckets.optQuery("/1/message.info@NESTED/message.info/buckets");
341+
Assert.assertThat(innerBuckets.query("/0/key"), equalTo("a"));
342+
Assert.assertThat(innerBuckets.query("/0/COUNT(*)/value"), equalTo(2));
343+
Assert.assertThat(innerBuckets.query("/1/key"), equalTo("c"));
344+
Assert.assertThat(innerBuckets.query("/1/COUNT(*)/value"), equalTo(1));
336345
}
337346

338347

@@ -414,50 +423,6 @@ private final Matcher<SearchHit> innerHits(String path, Matcher<SearchHit>... in
414423
Matchers for Aggregation Testing
415424
***********************************************************/
416425

417-
private <T extends Aggregation> T getAgg(SearchResponse resp,
418-
String fieldName) {
419-
return resp.getAggregations().get(fieldName);
420-
}
421-
422-
private <T extends Aggregation> T getNestedAgg(SearchResponse resp,
423-
String nestedFieldName,
424-
String aggAlias) {
425-
return getNestedAgg(resp.getAggregations(), nestedFieldName, aggAlias);
426-
}
427-
428-
private <T extends Aggregation> T getNestedAgg(Aggregations aggs,
429-
String nestedFieldName,
430-
String aggAlias) {
431-
return aggs.<InternalNested>get(nestedFieldName + "@NESTED").
432-
getAggregations().
433-
get(aggAlias);
434-
}
435-
436-
@SafeVarargs
437-
private final Matcher<Terms> buckets(Matcher<Terms.Bucket>... subMatchers) {
438-
return featureValueOf("buckets", containsInAnyOrder(subMatchers), Terms::getBuckets);
439-
}
440-
441-
private Matcher<Terms.Bucket> bucket(String key, Matcher<Aggregations> valMatcher) {
442-
return featureValueOf(key, valMatcher, Terms.Bucket::getAggregations);
443-
}
444-
445-
private Matcher<Aggregations> count(Matcher<Long> subMatcher) {
446-
return featureValueOf("COUNT(*)", subMatcher, aggs -> ((ValueCount) aggs.get("COUNT(*)")).getValue());
447-
}
448-
449-
private Matcher<Aggregations> sum(String nestedFieldName, String name, Matcher<Double> subMatcher) {
450-
return featureValueOf(name, subMatcher, aggs -> ((Sum) getNestedAgg(aggs, nestedFieldName, name)).getValue());
451-
}
452-
453-
private Matcher<Double> isCloseTo(double expected) {
454-
return closeTo(expected, 0.01);
455-
}
456-
457-
private Matcher<Long> equalTo(int expected) {
458-
return is((long) expected);
459-
}
460-
461426
private <T, U> FeatureMatcher<T, U> featureValueOf(String name, Matcher<U> subMatcher, Function<T, U> getter) {
462427
return new FeatureMatcher<T, U>(subMatcher, name, name) {
463428
@Override
@@ -471,19 +436,28 @@ protected U featureValueOf(T actual) {
471436
Query Utility to Fetch Response for SQL
472437
***********************************************************/
473438

474-
private SearchResponse query(String select, String... statements) {
439+
private SearchResponse query(String select, String... statements) throws IOException {
475440
return execute(select + " " + FROM + " " + String.join(" ", statements));
476441
}
477442

478-
private SearchResponse execute(String sql) {
479-
SearchDao searchDao = MainTestSuite.getSearchDao();
480-
try {
481-
SqlElasticRequestBuilder result = searchDao.explain(sql).explain();
482-
return (SearchResponse) result.get();
483-
}
484-
catch (SqlParseException | SQLFeatureNotSupportedException e) {
485-
throw new IllegalStateException("Query failed: " + sql, e);
486-
}
443+
private SearchResponse execute(String sql) throws IOException {
444+
final JSONObject jsonObject = executeQuery(sql);
445+
446+
final XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(
447+
NamedXContentRegistry.EMPTY,
448+
LoggingDeprecationHandler.INSTANCE,
449+
jsonObject.toString());
450+
return SearchResponse.fromXContent(parser);
451+
}
452+
453+
private JSONObject getAggregation(final JSONObject queryResult, final String aggregationName)
454+
{
455+
final String aggregationsObjName = "aggregations";
456+
Assert.assertTrue(queryResult.has(aggregationsObjName));
457+
458+
final JSONObject aggregations = queryResult.getJSONObject(aggregationsObjName);
459+
Assert.assertTrue(aggregations.has(aggregationName));
460+
return aggregations.getJSONObject(aggregationName);
487461
}
488462

489463
}

0 commit comments

Comments
 (0)