package io.crate.operation.operator; import io.crate.metadata.FunctionResolver; import io.crate.metadata.FunctionIdent; import io.crate.metadata.FunctionImplementation; import io.crate.operation.operator.any.*; import org.elasticsearch.common.inject.AbstractModule; import org.elasticsearch.common.inject.multibindings.MapBinder; import java.util.HashMap; import java.util.Map; public class OperatorModule extends AbstractModule { private Map<FunctionIdent, FunctionImplementation> functions = new HashMap<>(); private Map<String, FunctionResolver> dynamicFunctionResolvers = new HashMap<>(); private MapBinder<FunctionIdent, FunctionImplementation> functionBinder; private MapBinder<String, FunctionResolver> dynamicFunctionBinder; public void registerOperatorFunction(FunctionImplementation impl) { functions.put(impl.info().ident(), impl); } public void registerDynamicOperatorFunction(String name, FunctionResolver resolver) { dynamicFunctionResolvers.put(name, resolver); } @Override protected void configure() { AndOperator.register(this); OrOperator.register(this); EqOperator.register(this); LtOperator.register(this); LteOperator.register(this); GtOperator.register(this); GteOperator.register(this); LikeOperator.register(this); RegexpMatchOperator.register(this); RegexpMatchCaseInsensitiveOperator.register(this); AnyEqOperator.register(this); AnyNeqOperator.register(this); AnyGteOperator.register(this); AnyGtOperator.register(this); AnyLteOperator.register(this); AnyLtOperator.register(this); AnyLikeOperator.register(this); AnyNotLikeOperator.register(this); // bind all registered functions and resolver // by doing it here instead of the register functions, plugins can also use the // register functions in their onModule(...) hooks functionBinder = MapBinder.newMapBinder(binder(), FunctionIdent.class, FunctionImplementation.class); dynamicFunctionBinder = MapBinder.newMapBinder(binder(), String.class, FunctionResolver.class); for (Map.Entry<FunctionIdent, FunctionImplementation> entry : functions.entrySet()) { functionBinder.addBinding(entry.getKey()).toInstance(entry.getValue()); } for (Map.Entry<String, FunctionResolver> entry : dynamicFunctionResolvers.entrySet()) { dynamicFunctionBinder.addBinding(entry.getKey()).toInstance(entry.getValue()); } // clear registration maps functions = null; dynamicFunctionResolvers = null; } }