Inner queries not resolved correctly in has_child filter when searching directly against the parent type (in the URI for example), closes #1471.
This commit is contained in:
parent
7dfe48c33b
commit
72d2fd0da0
|
@ -59,9 +59,12 @@ public class HasChildFilterParser implements FilterParser {
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
currentFieldName = parser.currentName();
|
currentFieldName = parser.currentName();
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
// since we switch types, make sure we change the context
|
||||||
|
String[] origTypes = QueryParseContext.setTypesWithPrevious(childType == null ? null : new String[]{childType});
|
||||||
if ("query".equals(currentFieldName)) {
|
if ("query".equals(currentFieldName)) {
|
||||||
query = parseContext.parseInnerQuery();
|
query = parseContext.parseInnerQuery();
|
||||||
}
|
}
|
||||||
|
QueryParseContext.setTypes(origTypes);
|
||||||
} else if (token.isValue()) {
|
} else if (token.isValue()) {
|
||||||
if ("type".equals(currentFieldName)) {
|
if ("type".equals(currentFieldName)) {
|
||||||
childType = parser.text();
|
childType = parser.text();
|
||||||
|
|
|
@ -59,9 +59,12 @@ public class HasChildQueryParser implements QueryParser {
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
currentFieldName = parser.currentName();
|
currentFieldName = parser.currentName();
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
// since we switch types, make sure we change the context
|
||||||
|
String[] origTypes = QueryParseContext.setTypesWithPrevious(childType == null ? null : new String[]{childType});
|
||||||
if ("query".equals(currentFieldName)) {
|
if ("query".equals(currentFieldName)) {
|
||||||
query = parseContext.parseInnerQuery();
|
query = parseContext.parseInnerQuery();
|
||||||
}
|
}
|
||||||
|
QueryParseContext.setTypes(origTypes);
|
||||||
} else if (token.isValue()) {
|
} else if (token.isValue()) {
|
||||||
if ("type".equals(currentFieldName)) {
|
if ("type".equals(currentFieldName)) {
|
||||||
childType = parser.text();
|
childType = parser.text();
|
||||||
|
|
|
@ -40,7 +40,6 @@ import org.elasticsearch.index.mapper.FieldMappers;
|
||||||
import org.elasticsearch.index.mapper.MapperService;
|
import org.elasticsearch.index.mapper.MapperService;
|
||||||
import org.elasticsearch.index.similarity.SimilarityService;
|
import org.elasticsearch.index.similarity.SimilarityService;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -50,6 +49,26 @@ import java.util.Map;
|
||||||
*/
|
*/
|
||||||
public class QueryParseContext {
|
public class QueryParseContext {
|
||||||
|
|
||||||
|
private static ThreadLocal<String[]> typesContext = new ThreadLocal<String[]>();
|
||||||
|
|
||||||
|
public static void setTypes(String[] types) {
|
||||||
|
typesContext.set(types);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] getTypes() {
|
||||||
|
return typesContext.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] setTypesWithPrevious(String[] types) {
|
||||||
|
String[] old = typesContext.get();
|
||||||
|
setTypes(types);
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeTypes() {
|
||||||
|
typesContext.remove();
|
||||||
|
}
|
||||||
|
|
||||||
private final Index index;
|
private final Index index;
|
||||||
|
|
||||||
IndexQueryParserService indexQueryParser;
|
IndexQueryParserService indexQueryParser;
|
||||||
|
@ -203,8 +222,7 @@ public class QueryParseContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieldMapper fieldMapper(String name) {
|
public FieldMapper fieldMapper(String name) {
|
||||||
SearchContext searchContext = SearchContext.current();
|
FieldMappers fieldMappers = indexQueryParser.mapperService.smartNameFieldMappers(name, getTypes());
|
||||||
FieldMappers fieldMappers = indexQueryParser.mapperService.smartNameFieldMappers(name, searchContext == null ? null : searchContext.types());
|
|
||||||
if (fieldMappers == null) {
|
if (fieldMappers == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -220,12 +238,10 @@ public class QueryParseContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapperService.SmartNameFieldMappers smartFieldMappers(String name) {
|
public MapperService.SmartNameFieldMappers smartFieldMappers(String name) {
|
||||||
SearchContext searchContext = SearchContext.current();
|
return indexQueryParser.mapperService.smartName(name, getTypes());
|
||||||
return indexQueryParser.mapperService.smartName(name, searchContext == null ? null : searchContext.types());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapperService.SmartNameObjectMapper smartObjectMapper(String name) {
|
public MapperService.SmartNameObjectMapper smartObjectMapper(String name) {
|
||||||
SearchContext searchContext = SearchContext.current();
|
return indexQueryParser.mapperService.smartNameObjectMapper(name, getTypes());
|
||||||
return indexQueryParser.mapperService.smartNameObjectMapper(name, searchContext == null ? null : searchContext.types());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ import org.elasticsearch.index.mapper.FieldMappers;
|
||||||
import org.elasticsearch.index.mapper.MapperService;
|
import org.elasticsearch.index.mapper.MapperService;
|
||||||
import org.elasticsearch.index.query.IndexQueryParserService;
|
import org.elasticsearch.index.query.IndexQueryParserService;
|
||||||
import org.elasticsearch.index.query.ParsedQuery;
|
import org.elasticsearch.index.query.ParsedQuery;
|
||||||
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.index.search.nested.BlockJoinQuery;
|
import org.elasticsearch.index.search.nested.BlockJoinQuery;
|
||||||
import org.elasticsearch.index.service.IndexService;
|
import org.elasticsearch.index.service.IndexService;
|
||||||
import org.elasticsearch.index.shard.service.IndexShard;
|
import org.elasticsearch.index.shard.service.IndexShard;
|
||||||
|
@ -68,10 +69,12 @@ public class SearchContext implements Releasable {
|
||||||
|
|
||||||
public static void setCurrent(SearchContext value) {
|
public static void setCurrent(SearchContext value) {
|
||||||
current.set(value);
|
current.set(value);
|
||||||
|
QueryParseContext.setTypes(value.types());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeCurrent() {
|
public static void removeCurrent() {
|
||||||
current.remove();
|
current.remove();
|
||||||
|
QueryParseContext.removeTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SearchContext current() {
|
public static SearchContext current() {
|
||||||
|
|
Loading…
Reference in New Issue