package org.apache.lucene.queryparser.flexible.aqp.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.lucene.queryparser.flexible.aqp.builders.AqpFunctionQueryBuilder;
import org.apache.lucene.queryparser.flexible.aqp.builders.AqpFunctionQueryBuilderProvider;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.util.AttributeImpl;
import org.apache.lucene.util.AttributeReflector;
public class AqpFunctionQueryBuilderConfigImpl extends AttributeImpl implements
AqpFunctionQueryBuilderConfig {
private static final long serialVersionUID = 1919178907275699596L;
List<AqpFunctionQueryBuilderProvider> providers = new ArrayList<AqpFunctionQueryBuilderProvider>();
Map<String, AqpFunctionQueryBuilder> builders = new HashMap<String, AqpFunctionQueryBuilder>();
public void addProvider(AqpFunctionQueryBuilderProvider provider) {
if (!providers.contains(provider)) {
providers.add(provider);
}
}
public void addProvider(int index, AqpFunctionQueryBuilderProvider provider) {
if (providers.contains(provider)) {
providers.remove(provider);
}
providers.add(index, provider);
}
public void setBuilder(String funcName, AqpFunctionQueryBuilder builder) {
builders.put(funcName, builder);
}
/**
* NOTE: passing the config as an argument is not good, normally it should be
* accessible to us. However, the builders have no access to it, so we must
* do this
* @throws QueryNodeException
* when no builder is found
*/
public AqpFunctionQueryBuilder getBuilder(String funcName, QueryNode node, QueryConfigHandler config)
throws QueryNodeException {
if (builders.containsKey(funcName)) {
return builders.get(funcName);
}
for (AqpFunctionQueryBuilderProvider provider: providers) {
AqpFunctionQueryBuilder builder = provider.getBuilder(funcName, node, config);
if (builder != null) {
return builder;
}
}
return null;
}
@Override
public void clear() {
providers.clear();
builders.clear();
}
@Override
public void copyTo(AttributeImpl target) {
AqpFunctionQueryBuilderConfig t = (AqpFunctionQueryBuilderConfig) target;
for (AqpFunctionQueryBuilderProvider provider: providers) {
t.addProvider(provider);
}
for ( Entry<String, AqpFunctionQueryBuilder> builder: builders.entrySet()) {
t.setBuilder(builder.getKey(), builder.getValue());
}
}
@Override
public void reflectWith(AttributeReflector reflector) {
for (AqpFunctionQueryBuilderProvider provider: providers) {
reflector.reflect(AqpFunctionQueryBuilderConfig.class, "provider", provider);
}
for ( Entry<String, AqpFunctionQueryBuilder> builder: builders.entrySet()) {
reflector.reflect(AqpFunctionQueryBuilderConfig.class, "builder:" + builder.getKey(), builder.getValue());
}
}
}