package org.araqne.logdb.cep.query; import java.util.List; import org.araqne.logdb.QueryContext; import org.araqne.logdb.QueryParseException; import org.araqne.logdb.Row; import org.araqne.logdb.cep.EventContextService; import org.araqne.logdb.cep.EventContextStorage; import org.araqne.logdb.cep.EventKey; import org.araqne.logdb.query.expr.Expression; public class EvtCtxSetVarFunction implements Expression { private Expression topicExpr; private Expression keyExpr; private Expression varNameExpr; private Expression varDataExpr; private Expression hostExpr; private EventContextStorage storage; public EvtCtxSetVarFunction(QueryContext ctx, List<Expression> exprs, EventContextService eventContextService) { this.storage = eventContextService.getDefaultStorage(); if (exprs.size() != 4 && exprs.size() != 5) throw new QueryParseException("invalid-evtctxsetvar-arguments", -1, "argument-count-mismatch"); this.topicExpr = exprs.get(0); this.keyExpr = exprs.get(1); this.varNameExpr = exprs.get(2); this.varDataExpr = exprs.get(3); if (exprs.size() == 5) this.hostExpr = exprs.get(4); } @Override public Object eval(Row row) { Object arg1 = topicExpr.eval(row); Object arg2 = keyExpr.eval(row); if (arg1 == null || arg2 == null) return false; String topic = arg1.toString(); String key = arg2.toString(); String host = null; if (hostExpr != null) { Object arg5 = hostExpr.eval(row); if (arg5 != null) host = arg5.toString(); } EventKey evtKey = new EventKey(topic, key, host); Object arg3 = varNameExpr.eval(row); Object arg4 = varDataExpr.eval(row); if (arg3 == null) return false; storage.addContextVariable(evtKey, arg3.toString(), arg4); return true; } @Override public String toString() { return "evtctxsetvar(" + topicExpr + ", " + keyExpr + ", " + varNameExpr + ", " + varDataExpr + "," + hostExpr + ")"; } }