make fielddata fields a plugin

This commit is contained in:
Britta Weber 2015-07-22 17:42:49 +02:00
parent bcebb61f25
commit 5f0f66908e
9 changed files with 22 additions and 65 deletions

View File

@ -395,16 +395,6 @@ public class PercolateContext extends SearchContext {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public boolean hasFieldDataFields() {
throw new UnsupportedOperationException();
}
@Override
public FieldDataFieldsContext fieldDataFields() {
throw new UnsupportedOperationException();
}
@Override @Override
public boolean hasScriptFields() { public boolean hasScriptFields() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();

View File

@ -19,13 +19,14 @@
package org.elasticsearch.search.fetch.fielddata; package org.elasticsearch.search.fetch.fielddata;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.elasticsearch.search.fetch.FetchSubPhaseContext;
import java.util.List; import java.util.List;
/** /**
* All the required context to pull a field from the field data cache. * All the required context to pull a field from the field data cache.
*/ */
public class FieldDataFieldsContext { public class FieldDataFieldsContext implements FetchSubPhaseContext{
public static class FieldDataField { public static class FieldDataField {
private final String name; private final String name;

View File

@ -27,6 +27,7 @@ import org.elasticsearch.index.mapper.MappedFieldType;
import org.elasticsearch.search.SearchHitField; import org.elasticsearch.search.SearchHitField;
import org.elasticsearch.search.SearchParseElement; import org.elasticsearch.search.SearchParseElement;
import org.elasticsearch.search.fetch.FetchSubPhase; import org.elasticsearch.search.fetch.FetchSubPhase;
import org.elasticsearch.search.fetch.FetchSubPhaseContext;
import org.elasticsearch.search.internal.InternalSearchHit; import org.elasticsearch.search.internal.InternalSearchHit;
import org.elasticsearch.search.internal.InternalSearchHitField; import org.elasticsearch.search.internal.InternalSearchHitField;
import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.SearchContext;
@ -43,6 +44,20 @@ import java.util.Map;
*/ */
public class FieldDataFieldsFetchSubPhase implements FetchSubPhase { public class FieldDataFieldsFetchSubPhase implements FetchSubPhase {
public static final String[] NAMES = {"fielddata_fields", "fielddataFields"};
public static final ContextFactory CONTEXT_FACTORY = new ContextFactory() {
@Override
public String getName() {
return NAMES[0];
}
@Override
public FetchSubPhaseContext newContextInstance() {
return new FieldDataFieldsContext();
}
};
@Inject @Inject
public FieldDataFieldsFetchSubPhase() { public FieldDataFieldsFetchSubPhase() {
} }
@ -66,12 +81,12 @@ public class FieldDataFieldsFetchSubPhase implements FetchSubPhase {
@Override @Override
public boolean hitExecutionNeeded(SearchContext context) { public boolean hitExecutionNeeded(SearchContext context) {
return context.hasFieldDataFields(); return context.hasFetchSubPhaseContext(CONTEXT_FACTORY);
} }
@Override @Override
public void hitExecute(SearchContext context, HitContext hitContext) { public void hitExecute(SearchContext context, HitContext hitContext) {
for (FieldDataFieldsContext.FieldDataField field : context.fieldDataFields().fields()) { for (FieldDataFieldsContext.FieldDataField field : ((FieldDataFieldsContext)context.getFetchSubPhaseContext(CONTEXT_FACTORY)).fields()) {
if (hitContext.hit().fieldsOrNull() == null) { if (hitContext.hit().fieldsOrNull() == null) {
hitContext.hit().fields(new HashMap<String, SearchHitField>(2)); hitContext.hit().fields(new HashMap<String, SearchHitField>(2));
} }

View File

@ -36,15 +36,16 @@ import org.elasticsearch.search.internal.SearchContext;
public class FieldDataFieldsParseElement implements SearchParseElement { public class FieldDataFieldsParseElement implements SearchParseElement {
@Override @Override
public void parse(XContentParser parser, SearchContext context) throws Exception { public void parse(XContentParser parser, SearchContext context) throws Exception {
FieldDataFieldsContext fieldDataFieldsContext = (FieldDataFieldsContext)context.getFetchSubPhaseContext(FieldDataFieldsFetchSubPhase.CONTEXT_FACTORY);
XContentParser.Token token = parser.currentToken(); XContentParser.Token token = parser.currentToken();
if (token == XContentParser.Token.START_ARRAY) { if (token == XContentParser.Token.START_ARRAY) {
while (parser.nextToken() != XContentParser.Token.END_ARRAY) { while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
String fieldName = parser.text(); String fieldName = parser.text();
context.fieldDataFields().add(new FieldDataFieldsContext.FieldDataField(fieldName)); fieldDataFieldsContext.add(new FieldDataFieldsContext.FieldDataField(fieldName));
} }
} else if (token == XContentParser.Token.VALUE_STRING) { } else if (token == XContentParser.Token.VALUE_STRING) {
String fieldName = parser.text(); String fieldName = parser.text();
context.fieldDataFields().add(new FieldDataFieldsContext.FieldDataField(fieldName)); fieldDataFieldsContext.add(new FieldDataFieldsContext.FieldDataField(fieldName));
} else { } else {
throw new IllegalStateException("Expected either a VALUE_STRING or an START_ARRAY but got " + token); throw new IllegalStateException("Expected either a VALUE_STRING or an START_ARRAY but got " + token);
} }

View File

@ -351,19 +351,6 @@ public class DefaultSearchContext extends SearchContext {
this.rescore.add(rescore); this.rescore.add(rescore);
} }
@Override
public boolean hasFieldDataFields() {
return fieldDataFields != null;
}
@Override
public FieldDataFieldsContext fieldDataFields() {
if (fieldDataFields == null) {
fieldDataFields = new FieldDataFieldsContext();
}
return this.fieldDataFields;
}
@Override @Override
public boolean hasScriptFields() { public boolean hasScriptFields() {
return scriptFields != null; return scriptFields != null;

View File

@ -211,16 +211,6 @@ public abstract class FilteredSearchContext extends SearchContext {
in.addRescore(rescore); in.addRescore(rescore);
} }
@Override
public boolean hasFieldDataFields() {
return in.hasFieldDataFields();
}
@Override
public FieldDataFieldsContext fieldDataFields() {
return in.fieldDataFields();
}
@Override @Override
public boolean hasScriptFields() { public boolean hasScriptFields() {
return in.hasScriptFields(); return in.hasScriptFields();

View File

@ -186,10 +186,6 @@ public abstract class SearchContext implements Releasable, HasContextAndHeaders
public abstract void addRescore(RescoreSearchContext rescore); public abstract void addRescore(RescoreSearchContext rescore);
public abstract boolean hasFieldDataFields();
public abstract FieldDataFieldsContext fieldDataFields();
public abstract boolean hasScriptFields(); public abstract boolean hasScriptFields();
public abstract ScriptFieldsContext scriptFields(); public abstract ScriptFieldsContext scriptFields();

View File

@ -132,19 +132,6 @@ public class SubSearchContext extends FilteredSearchContext {
throw new UnsupportedOperationException("Not supported"); throw new UnsupportedOperationException("Not supported");
} }
@Override
public boolean hasFieldDataFields() {
return fieldDataFields != null;
}
@Override
public FieldDataFieldsContext fieldDataFields() {
if (fieldDataFields == null) {
fieldDataFields = new FieldDataFieldsContext();
}
return this.fieldDataFields;
}
@Override @Override
public boolean hasScriptFields() { public boolean hasScriptFields() {
return scriptFields != null; return scriptFields != null;

View File

@ -245,16 +245,6 @@ public class TestSearchContext extends SearchContext {
public void addRescore(RescoreSearchContext rescore) { public void addRescore(RescoreSearchContext rescore) {
} }
@Override
public boolean hasFieldDataFields() {
return false;
}
@Override
public FieldDataFieldsContext fieldDataFields() {
return null;
}
@Override @Override
public boolean hasScriptFields() { public boolean hasScriptFields() {
return false; return false;