package org.apache.lucene.queryparser.flexible.aqp.processors;
import java.util.List;
import java.util.Map;
import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
import org.apache.lucene.queryparser.flexible.aqp.parser.AqpStandardQueryConfigHandler;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.core.config.ConfigurationKey;
import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
import org.apache.lucene.queryparser.flexible.core.nodes.FieldQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessorImpl;
/**
* Looks at the QueryNode(s) and translates the field name if we have a mapping
* for it. It is used to change the field names on-the-fly
*
* @see QueryConfigHandler
*
*/
public class AqpFieldMapperProcessor extends QueryNodeProcessorImpl {
private Map<String, String> fieldMap;
ConfigurationKey<Map<String, String>> mapKey = AqpStandardQueryConfigHandler.ConfigurationKeys.FIELD_MAPPER;
public AqpFieldMapperProcessor() {
// empty constructor
}
@Override
public QueryNode process(QueryNode queryTree) throws QueryNodeException {
if (getQueryConfigHandler().has(mapKey)) {
fieldMap = getQueryConfigHandler().get(mapKey);
if (this.fieldMap != null) {
return super.process(queryTree);
}
}
return queryTree;
}
@Override
protected QueryNode preProcessNode(QueryNode node) throws QueryNodeException {
if (node instanceof FieldQueryNode) {
String field = ((FieldQueryNode) node).getFieldAsString();
if (fieldMap.containsKey(field)) {
String newField = fieldMap.get(field);
if (newField == null) {
throw new QueryNodeException(new MessageImpl("Server error",
"The configuration error, field " + field
+ " is translated to: null"));
}
((FieldQueryNode) node).setField(newField);
}
}
return node;
}
@Override
protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException {
return node;
}
@Override
protected List<QueryNode> setChildrenOrder(List<QueryNode> children)
throws QueryNodeException {
return children;
}
}