Skip to content

Commit

Permalink
SQL: fix object extraction from sources (#37502)
Browse files Browse the repository at this point in the history
Throws an exception if hit extractor tries to retrieve unsupported
object. For example, selecting "a" from `{"a": {"b": "c"}}` now throws
an exception instead of returning null.

Relates to #37364
  • Loading branch information
imotov committed Jan 18, 2019
1 parent c76abc2 commit 595eab3
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,14 @@ Object extractFromSource(Map<String, Object> map) {
sj.add(path[i]);
Object node = subMap.get(sj.toString());
if (node instanceof Map) {
// Add the sub-map to the queue along with the current path index
queue.add(new Tuple<>(i, (Map<String, Object>) node));
if (i < path.length - 1) {
// Add the sub-map to the queue along with the current path index
queue.add(new Tuple<>(i, (Map<String, Object>) node));
} else {
// We exhausted the path and got a map
// If it is an object - it will be handled in the value extractor
value = node;
}
} else if (node != null) {
if (i < path.length - 1) {
// If we reach a concrete value without exhausting the full path, something is wrong with the mapping
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,24 @@ public void testFieldWithDotsAndSamePathButDifferentHierarchy() {
assertThat(ex.getMessage(), is("Multiple values (returned by [a.b.c.d.e.f.g]) are not supported"));
}

public void testObjectsForSourceValue() throws IOException {
String fieldName = randomAlphaOfLength(5);
FieldHitExtractor fe = new FieldHitExtractor(fieldName, null, false);
SearchHit hit = new SearchHit(1);
XContentBuilder source = JsonXContent.contentBuilder();
source.startObject(); {
source.startObject(fieldName); {
source.field("b", "c");
}
source.endObject();
}
source.endObject();
BytesReference sourceRef = BytesReference.bytes(source);
hit.sourceRef(sourceRef);
SqlException ex = expectThrows(SqlException.class, () -> fe.extract(hit));
assertThat(ex.getMessage(), is("Objects (returned by [" + fieldName + "]) are not supported"));
}

private Object randomValue() {
Supplier<Object> value = randomFrom(Arrays.asList(
() -> randomAlphaOfLength(10),
Expand Down

0 comments on commit 595eab3

Please sign in to comment.