diff options
Diffstat (limited to 'modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java')
-rw-r--r-- | modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java b/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java index f574236b35..6485b8f649 100644 --- a/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java +++ b/modules/parent-join/src/main/java/org/elasticsearch/join/query/HasChildQueryBuilder.java @@ -49,6 +49,8 @@ import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryRewriteContext; import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.query.QueryShardException; +import org.elasticsearch.join.mapper.ParentIdFieldMapper; +import org.elasticsearch.join.mapper.ParentJoinFieldMapper; import java.io.IOException; import java.util.HashMap; @@ -305,6 +307,34 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil @Override protected Query doToQuery(QueryShardContext context) throws IOException { + if (context.getIndexSettings().isSingleType()) { + return joinFieldDoToQuery(context); + } else { + return parentFieldDoToQuery(context); + } + } + + private Query joinFieldDoToQuery(QueryShardContext context) throws IOException { + ParentJoinFieldMapper joinFieldMapper = ParentJoinFieldMapper.getMapper(context.getMapperService()); + ParentIdFieldMapper parentIdFieldMapper = joinFieldMapper.getParentIdFieldMapper(type, false); + if (parentIdFieldMapper != null) { + Query parentFilter = parentIdFieldMapper.getParentFilter(); + Query childFilter = parentIdFieldMapper.getChildFilter(type); + Query innerQuery = Queries.filtered(query.toQuery(context), childFilter); + MappedFieldType fieldType = parentIdFieldMapper.fieldType(); + final SortedSetDVOrdinalsIndexFieldData fieldData = context.getForField(fieldType); + return new LateParsingQuery(parentFilter, innerQuery, minChildren(), maxChildren(), + fieldType.name(), scoreMode, fieldData, context.getSearchSimilarity()); + } else { + if (ignoreUnmapped) { + return new MatchNoDocsQuery(); + } else { + throw new QueryShardException(context, "[" + NAME + "] join field has no parent type configured"); + } + } + } + + private Query parentFieldDoToQuery(QueryShardContext context) throws IOException { Query innerQuery; final String[] previousTypes = context.getTypes(); context.setTypes(type); @@ -313,8 +343,7 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil } finally { context.setTypes(previousTypes); } - - DocumentMapper childDocMapper = context.documentMapper(type); + DocumentMapper childDocMapper = context.getMapperService().documentMapper(type); if (childDocMapper == null) { if (ignoreUnmapped) { return new MatchNoDocsQuery(); @@ -330,16 +359,17 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil DocumentMapper parentDocMapper = context.getMapperService().documentMapper(parentType); if (parentDocMapper == null) { throw new QueryShardException(context, - "[" + NAME + "] Type [" + type + "] points to a non existent parent type [" + parentType + "]"); + "[" + NAME + "] Type [" + type + "] points to a non existent parent type [" + parentType + "]"); } // wrap the query with type query innerQuery = Queries.filtered(innerQuery, childDocMapper.typeFilter(context)); + String joinField = ParentFieldMapper.joinField(parentType); final MappedFieldType parentFieldType = parentDocMapper.parentFieldMapper().getParentJoinFieldType(); final SortedSetDVOrdinalsIndexFieldData fieldData = context.getForField(parentFieldType); return new LateParsingQuery(parentDocMapper.typeFilter(context), innerQuery, minChildren(), maxChildren(), - parentType, scoreMode, fieldData, context.getSearchSimilarity()); + joinField, scoreMode, fieldData, context.getSearchSimilarity()); } /** @@ -358,19 +388,19 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil private final Query innerQuery; private final int minChildren; private final int maxChildren; - private final String parentType; + private final String joinField; private final ScoreMode scoreMode; private final SortedSetDVOrdinalsIndexFieldData fieldDataJoin; private final Similarity similarity; LateParsingQuery(Query toQuery, Query innerQuery, int minChildren, int maxChildren, - String parentType, ScoreMode scoreMode, + String joinField, ScoreMode scoreMode, SortedSetDVOrdinalsIndexFieldData fieldData, Similarity similarity) { this.toQuery = toQuery; this.innerQuery = innerQuery; this.minChildren = minChildren; this.maxChildren = maxChildren; - this.parentType = parentType; + this.joinField = joinField; this.scoreMode = scoreMode; this.fieldDataJoin = fieldData; this.similarity = similarity; @@ -383,7 +413,6 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil return rewritten; } if (reader instanceof DirectoryReader) { - String joinField = ParentFieldMapper.joinField(parentType); IndexSearcher indexSearcher = new IndexSearcher(reader); indexSearcher.setQueryCache(null); indexSearcher.setSimilarity(similarity); @@ -414,18 +443,18 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder<HasChildQueryBuil if (maxChildren != that.maxChildren) return false; if (!toQuery.equals(that.toQuery)) return false; if (!innerQuery.equals(that.innerQuery)) return false; - if (!parentType.equals(that.parentType)) return false; + if (!joinField.equals(that.joinField)) return false; return scoreMode == that.scoreMode; } @Override public int hashCode() { - return Objects.hash(classHash(), toQuery, innerQuery, minChildren, maxChildren, parentType, scoreMode); + return Objects.hash(getClass(), toQuery, innerQuery, minChildren, maxChildren, joinField, scoreMode); } @Override public String toString(String s) { - return "LateParsingQuery {parentType=" + parentType + "}"; + return "LateParsingQuery {joinField=" + joinField + "}"; } public int getMinChildren() { |