From 92942c9327641317d7477b962aa7c48022e5eb05 Mon Sep 17 00:00:00 2001 From: Jay Modi Date: Thu, 6 Apr 2017 12:44:25 +0100 Subject: [PATCH] Add support for IndexOrDocValuesQuery in FieldExtractor (elastic/x-pack-elasticsearch#976) This commit adds support for extracting the fields from a IndexOrDocValuesQuery so that we can still take advantage of the cache when this query is used. relates elastic/x-pack-elasticsearch#973 Original commit: elastic/x-pack-elasticsearch@0b97202a416e6ab504c5cc239439ea3a4a434332 --- .../authz/accesscontrol/FieldExtractor.java | 4 ++++ .../authz/accesscontrol/FieldExtractorTests.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/plugin/src/main/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractor.java b/plugin/src/main/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractor.java index bf5ab116a83..46951aec3cc 100644 --- a/plugin/src/main/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractor.java +++ b/plugin/src/main/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractor.java @@ -11,6 +11,7 @@ import org.apache.lucene.search.DisjunctionMaxQuery; import org.apache.lucene.search.DocValuesNumbersQuery; import org.apache.lucene.search.DocValuesRangeQuery; import org.apache.lucene.search.FieldValueQuery; +import org.apache.lucene.search.IndexOrDocValuesQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.MultiPhraseQuery; @@ -78,6 +79,9 @@ class FieldExtractor { fields.add(((FieldValueQuery)query).getField()); } else if (query instanceof DocValuesNumbersQuery) { fields.add(((DocValuesNumbersQuery)query).getField()); + } else if (query instanceof IndexOrDocValuesQuery) { + extractFields(((IndexOrDocValuesQuery) query).getIndexQuery(), fields); + extractFields(((IndexOrDocValuesQuery) query).getRandomAccessQuery(), fields); } else if (query instanceof DocValuesRangeQuery) { fields.add(((DocValuesRangeQuery)query).getField()); } else if (query instanceof MatchAllDocsQuery) { diff --git a/plugin/src/test/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractorTests.java b/plugin/src/test/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractorTests.java index b0e42a0d121..06fd71be512 100644 --- a/plugin/src/test/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractorTests.java +++ b/plugin/src/test/java/org/elasticsearch/xpack/security/authz/accesscontrol/FieldExtractorTests.java @@ -14,6 +14,7 @@ import org.apache.lucene.search.DisjunctionMaxQuery; import org.apache.lucene.search.DocValuesNumbersQuery; import org.apache.lucene.search.DocValuesRangeQuery; import org.apache.lucene.search.FieldValueQuery; +import org.apache.lucene.search.IndexOrDocValuesQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.MultiPhraseQuery; @@ -135,4 +136,19 @@ public class FieldExtractorTests extends ESTestCase { FieldExtractor.extractFields(new AssertingQuery(random(), new MatchAllDocsQuery()), fields); }); } + + public void testIndexOrDocValuesQuery() { + Set fields = new HashSet<>(); + IndexOrDocValuesQuery query = new IndexOrDocValuesQuery(new FieldValueQuery("foo"), + new DocValuesNumbersQuery("foo", 5L)); + FieldExtractor.extractFields(query, fields); + assertEquals(asSet("foo"), fields); + + // what if they have different fields - some programming error + fields.clear(); + query = new IndexOrDocValuesQuery(new FieldValueQuery("foo1"), + new DocValuesNumbersQuery("bar", 5L)); + FieldExtractor.extractFields(query, fields); + assertEquals(asSet("foo1", "bar"), fields); + } }