You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ce...@apache.org on 2017/10/30 15:45:03 UTC

metron git commit: METRON-1254: Conditionals as map keys do not function in Stellar closes apache/incubator-metron#801

Repository: metron
Updated Branches:
  refs/heads/master 5c41bf7f3 -> 191d5d84a


METRON-1254: Conditionals as map keys do not function in Stellar closes apache/incubator-metron#801


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/191d5d84
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/191d5d84
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/191d5d84

Branch: refs/heads/master
Commit: 191d5d84ae5ff9f7c464555c6a1285d9c5a702bf
Parents: 5c41bf7
Author: cstella <ce...@gmail.com>
Authored: Mon Oct 30 11:44:51 2017 -0400
Committer: cstella <ce...@gmail.com>
Committed: Mon Oct 30 11:44:51 2017 -0400

----------------------------------------------------------------------
 .../metron/stellar/common/generated/Stellar.g4  |   5 +
 .../metron/stellar/common/StellarCompiler.java  |   4 +-
 .../common/generated/StellarBaseListener.java   |  12 +
 .../common/generated/StellarListener.java       |  12 +
 .../stellar/common/generated/StellarParser.java | 538 +++++++++++--------
 .../stellar/dsl/functions/BasicStellarTest.java |  19 +
 6 files changed, 366 insertions(+), 224 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/main/antlr4/org/apache/metron/stellar/common/generated/Stellar.g4
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/antlr4/org/apache/metron/stellar/common/generated/Stellar.g4 b/metron-stellar/stellar-common/src/main/antlr4/org/apache/metron/stellar/common/generated/Stellar.g4
index edd9632..dd92e3d 100644
--- a/metron-stellar/stellar-common/src/main/antlr4/org/apache/metron/stellar/common/generated/Stellar.g4
+++ b/metron-stellar/stellar-common/src/main/antlr4/org/apache/metron/stellar/common/generated/Stellar.g4
@@ -194,6 +194,8 @@ op_list :
   | op_list COMMA identifier_operand
   | conditional_expr
   | op_list COMMA conditional_expr
+  | comparison_expr
+  | op_list COMMA comparison_expr
   ;
 
 list_entity :
@@ -203,7 +205,9 @@ list_entity :
 
 kv_list :
   identifier_operand COLON transformation_expr
+  | comparison_expr COLON transformation_expr
   | kv_list COMMA identifier_operand COLON transformation_expr
+  | kv_list COMMA comparison_expr COLON transformation_expr
   ;
 
 map_entity :
@@ -249,6 +253,7 @@ identifier_operand :
   | NULL #NullConst
   | EXISTS LPAREN IDENTIFIER RPAREN #ExistsFunc
   | LPAREN conditional_expr RPAREN #condExpr_paren
+  | functions #func
   ;
 
 

http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java
index fbb5bc0..69564df 100644
--- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java
+++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/StellarCompiler.java
@@ -662,7 +662,7 @@ public class StellarCompiler extends StellarBaseListener {
   public void exitMap_entity(StellarParser.Map_entityContext ctx) {
     final FrameContext.Context context = getArgContext();
     expression.tokenDeque.push(new Token<>( (tokenDeque, state) -> {
-      HashMap<String, Object> args = new HashMap<>();
+      HashMap<Object, Object> args = new HashMap<>();
       Object value = null;
       for (int i = 0; true; i++) {
         Token<?> token = popDeque(tokenDeque);
@@ -672,7 +672,7 @@ public class StellarCompiler extends StellarBaseListener {
           if (i % 2 == 0) {
             value = token.getValue();
           } else {
-            args.put(token.getValue() + "", value);
+            args.put(token.getValue(), value);
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarBaseListener.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarBaseListener.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarBaseListener.java
index 6e0ae8c..d2806b9 100644
--- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarBaseListener.java
+++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarBaseListener.java
@@ -709,6 +709,18 @@ public class StellarBaseListener implements StellarListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterFunc(StellarParser.FuncContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitFunc(StellarParser.FuncContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterLambda_without_args(StellarParser.Lambda_without_argsContext ctx) { }
 	/**
 	 * {@inheritDoc}

http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarListener.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarListener.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarListener.java
index 8b16e00..f07efaa 100644
--- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarListener.java
+++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarListener.java
@@ -679,6 +679,18 @@ public interface StellarListener extends ParseTreeListener {
 	 */
 	void exitCondExpr_paren(StellarParser.CondExpr_parenContext ctx);
 	/**
+	 * Enter a parse tree produced by the {@code func}
+	 * labeled alternative in {@link StellarParser#identifier_operand}.
+	 * @param ctx the parse tree
+	 */
+	void enterFunc(StellarParser.FuncContext ctx);
+	/**
+	 * Exit a parse tree produced by the {@code func}
+	 * labeled alternative in {@link StellarParser#identifier_operand}.
+	 * @param ctx the parse tree
+	 */
+	void exitFunc(StellarParser.FuncContext ctx);
+	/**
 	 * Enter a parse tree produced by {@link StellarParser#lambda_without_args}.
 	 * @param ctx the parse tree
 	 */

http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarParser.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarParser.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarParser.java
index 1ea8a11..3ee2603 100644
--- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarParser.java
+++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/generated/StellarParser.java
@@ -1194,6 +1194,9 @@ public class StellarParser extends Parser {
 		public Conditional_exprContext conditional_expr() {
 			return getRuleContext(Conditional_exprContext.class,0);
 		}
+		public Comparison_exprContext comparison_expr() {
+			return getRuleContext(Comparison_exprContext.class,0);
+		}
 		public Op_listContext op_list() {
 			return getRuleContext(Op_listContext.class,0);
 		}
@@ -1227,7 +1230,7 @@ public class StellarParser extends Parser {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(152);
+			setState(153);
 			switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
 			case 1:
 				{
@@ -1241,9 +1244,15 @@ public class StellarParser extends Parser {
 				conditional_expr();
 				}
 				break;
+			case 3:
+				{
+				setState(152);
+				comparison_expr(0);
+				}
+				break;
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(162);
+			setState(166);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -1251,17 +1260,17 @@ public class StellarParser extends Parser {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					setState(160);
+					setState(164);
 					switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
 					case 1:
 						{
 						_localctx = new Op_listContext(_parentctx, _parentState);
 						pushNewRecursionContext(_localctx, _startState, RULE_op_list);
-						setState(154);
-						if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
 						setState(155);
-						match(COMMA);
+						if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
 						setState(156);
+						match(COMMA);
+						setState(157);
 						identifier_operand();
 						}
 						break;
@@ -1269,18 +1278,30 @@ public class StellarParser extends Parser {
 						{
 						_localctx = new Op_listContext(_parentctx, _parentState);
 						pushNewRecursionContext(_localctx, _startState, RULE_op_list);
-						setState(157);
-						if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
 						setState(158);
-						match(COMMA);
+						if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
 						setState(159);
+						match(COMMA);
+						setState(160);
 						conditional_expr();
 						}
 						break;
+					case 3:
+						{
+						_localctx = new Op_listContext(_parentctx, _parentState);
+						pushNewRecursionContext(_localctx, _startState, RULE_op_list);
+						setState(161);
+						if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+						setState(162);
+						match(COMMA);
+						setState(163);
+						comparison_expr(0);
+						}
+						break;
 					}
 					} 
 				}
-				setState(164);
+				setState(168);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
 			}
@@ -1321,25 +1342,25 @@ public class StellarParser extends Parser {
 		List_entityContext _localctx = new List_entityContext(_ctx, getState());
 		enterRule(_localctx, 28, RULE_list_entity);
 		try {
-			setState(171);
+			setState(175);
 			switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(165);
+				setState(169);
 				match(LBRACKET);
-				setState(166);
+				setState(170);
 				match(RBRACKET);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(167);
+				setState(171);
 				match(LBRACKET);
-				setState(168);
+				setState(172);
 				op_list(0);
-				setState(169);
+				setState(173);
 				match(RBRACKET);
 				}
 				break;
@@ -1364,6 +1385,9 @@ public class StellarParser extends Parser {
 		public Transformation_exprContext transformation_expr() {
 			return getRuleContext(Transformation_exprContext.class,0);
 		}
+		public Comparison_exprContext comparison_expr() {
+			return getRuleContext(Comparison_exprContext.class,0);
+		}
 		public Kv_listContext kv_list() {
 			return getRuleContext(Kv_listContext.class,0);
 		}
@@ -1397,42 +1421,78 @@ public class StellarParser extends Parser {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			{
-			setState(174);
-			identifier_operand();
-			setState(175);
-			match(COLON);
-			setState(176);
-			transformation_expr();
+			setState(186);
+			switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
+			case 1:
+				{
+				setState(178);
+				identifier_operand();
+				setState(179);
+				match(COLON);
+				setState(180);
+				transformation_expr();
+				}
+				break;
+			case 2:
+				{
+				setState(182);
+				comparison_expr(0);
+				setState(183);
+				match(COLON);
+				setState(184);
+				transformation_expr();
+				}
+				break;
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(186);
+			setState(202);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,14,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					{
-					_localctx = new Kv_listContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_kv_list);
-					setState(178);
-					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(179);
-					match(COMMA);
-					setState(180);
-					identifier_operand();
-					setState(181);
-					match(COLON);
-					setState(182);
-					transformation_expr();
+					setState(200);
+					switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+					case 1:
+						{
+						_localctx = new Kv_listContext(_parentctx, _parentState);
+						pushNewRecursionContext(_localctx, _startState, RULE_kv_list);
+						setState(188);
+						if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+						setState(189);
+						match(COMMA);
+						setState(190);
+						identifier_operand();
+						setState(191);
+						match(COLON);
+						setState(192);
+						transformation_expr();
+						}
+						break;
+					case 2:
+						{
+						_localctx = new Kv_listContext(_parentctx, _parentState);
+						pushNewRecursionContext(_localctx, _startState, RULE_kv_list);
+						setState(194);
+						if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+						setState(195);
+						match(COMMA);
+						setState(196);
+						comparison_expr(0);
+						setState(197);
+						match(COLON);
+						setState(198);
+						transformation_expr();
+						}
+						break;
 					}
 					} 
 				}
-				setState(188);
+				setState(204);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,14,_ctx);
 			}
 			}
 		}
@@ -1471,25 +1531,25 @@ public class StellarParser extends Parser {
 		Map_entityContext _localctx = new Map_entityContext(_ctx, getState());
 		enterRule(_localctx, 32, RULE_map_entity);
 		try {
-			setState(195);
-			switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+			setState(211);
+			switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(189);
+				setState(205);
 				match(LBRACE);
-				setState(190);
+				setState(206);
 				kv_list(0);
-				setState(191);
+				setState(207);
 				match(RBRACE);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(193);
+				setState(209);
 				match(LBRACE);
-				setState(194);
+				setState(210);
 				match(RBRACE);
 				}
 				break;
@@ -1588,29 +1648,29 @@ public class StellarParser extends Parser {
 			_ctx = _localctx;
 			_prevctx = _localctx;
 
-			setState(198);
+			setState(214);
 			arithmetic_expr_mul(0);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(208);
+			setState(224);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					setState(206);
-					switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
+					setState(222);
+					switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
 					case 1:
 						{
 						_localctx = new ArithExpr_plusContext(new Arithmetic_exprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_arithmetic_expr);
-						setState(200);
+						setState(216);
 						if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
-						setState(201);
+						setState(217);
 						match(PLUS);
-						setState(202);
+						setState(218);
 						arithmetic_expr_mul(0);
 						}
 						break;
@@ -1618,20 +1678,20 @@ public class StellarParser extends Parser {
 						{
 						_localctx = new ArithExpr_minusContext(new Arithmetic_exprContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_arithmetic_expr);
-						setState(203);
+						setState(219);
 						if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-						setState(204);
+						setState(220);
 						match(MINUS);
-						setState(205);
+						setState(221);
 						arithmetic_expr_mul(0);
 						}
 						break;
 					}
 					} 
 				}
-				setState(210);
+				setState(226);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
 			}
 			}
 		}
@@ -1728,29 +1788,29 @@ public class StellarParser extends Parser {
 			_ctx = _localctx;
 			_prevctx = _localctx;
 
-			setState(212);
+			setState(228);
 			arithmetic_operands();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(222);
+			setState(238);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,19,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
-					setState(220);
-					switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
+					setState(236);
+					switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
 					case 1:
 						{
 						_localctx = new ArithExpr_mulContext(new Arithmetic_expr_mulContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_arithmetic_expr_mul);
-						setState(214);
+						setState(230);
 						if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
-						setState(215);
+						setState(231);
 						match(MUL);
-						setState(216);
+						setState(232);
 						arithmetic_expr_mul(3);
 						}
 						break;
@@ -1758,20 +1818,20 @@ public class StellarParser extends Parser {
 						{
 						_localctx = new ArithExpr_divContext(new Arithmetic_expr_mulContext(_parentctx, _parentState));
 						pushNewRecursionContext(_localctx, _startState, RULE_arithmetic_expr_mul);
-						setState(217);
+						setState(233);
 						if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-						setState(218);
+						setState(234);
 						match(DIV);
-						setState(219);
+						setState(235);
 						arithmetic_expr_mul(2);
 						}
 						break;
 					}
 					} 
 				}
-				setState(224);
+				setState(240);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,17,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,19,_ctx);
 			}
 			}
 		}
@@ -1820,9 +1880,9 @@ public class StellarParser extends Parser {
 			_localctx = new TransformationFuncContext(_localctx);
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(225);
+			setState(241);
 			match(IDENTIFIER);
-			setState(226);
+			setState(242);
 			func_args();
 			}
 		}
@@ -1971,13 +2031,13 @@ public class StellarParser extends Parser {
 		Arithmetic_operandsContext _localctx = new Arithmetic_operandsContext(_ctx, getState());
 		enterRule(_localctx, 40, RULE_arithmetic_operands);
 		try {
-			setState(243);
-			switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+			setState(259);
+			switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) {
 			case 1:
 				_localctx = new NumericFunctionsContext(_localctx);
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(228);
+				setState(244);
 				functions();
 				}
 				break;
@@ -1985,7 +2045,7 @@ public class StellarParser extends Parser {
 				_localctx = new DoubleLiteralContext(_localctx);
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(229);
+				setState(245);
 				match(DOUBLE_LITERAL);
 				}
 				break;
@@ -1993,7 +2053,7 @@ public class StellarParser extends Parser {
 				_localctx = new IntLiteralContext(_localctx);
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(230);
+				setState(246);
 				match(INT_LITERAL);
 				}
 				break;
@@ -2001,7 +2061,7 @@ public class StellarParser extends Parser {
 				_localctx = new LongLiteralContext(_localctx);
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(231);
+				setState(247);
 				match(LONG_LITERAL);
 				}
 				break;
@@ -2009,7 +2069,7 @@ public class StellarParser extends Parser {
 				_localctx = new FloatLiteralContext(_localctx);
 				enterOuterAlt(_localctx, 5);
 				{
-				setState(232);
+				setState(248);
 				match(FLOAT_LITERAL);
 				}
 				break;
@@ -2017,7 +2077,7 @@ public class StellarParser extends Parser {
 				_localctx = new VariableContext(_localctx);
 				enterOuterAlt(_localctx, 6);
 				{
-				setState(233);
+				setState(249);
 				match(IDENTIFIER);
 				}
 				break;
@@ -2025,7 +2085,7 @@ public class StellarParser extends Parser {
 				_localctx = new NaNArithContext(_localctx);
 				enterOuterAlt(_localctx, 7);
 				{
-				setState(234);
+				setState(250);
 				match(NAN);
 				}
 				break;
@@ -2033,11 +2093,11 @@ public class StellarParser extends Parser {
 				_localctx = new ParenArithContext(_localctx);
 				enterOuterAlt(_localctx, 8);
 				{
-				setState(235);
+				setState(251);
 				match(LPAREN);
-				setState(236);
+				setState(252);
 				arithmetic_expr(0);
-				setState(237);
+				setState(253);
 				match(RPAREN);
 				}
 				break;
@@ -2045,11 +2105,11 @@ public class StellarParser extends Parser {
 				_localctx = new CondExprContext(_localctx);
 				enterOuterAlt(_localctx, 9);
 				{
-				setState(239);
+				setState(255);
 				match(LPAREN);
-				setState(240);
+				setState(256);
 				conditional_expr();
-				setState(241);
+				setState(257);
 				match(RPAREN);
 				}
 				break;
@@ -2117,6 +2177,20 @@ public class StellarParser extends Parser {
 			if ( listener instanceof StellarListener ) ((StellarListener)listener).exitStringLiteral(this);
 		}
 	}
+	public static class FuncContext extends Identifier_operandContext {
+		public FunctionsContext functions() {
+			return getRuleContext(FunctionsContext.class,0);
+		}
+		public FuncContext(Identifier_operandContext ctx) { copyFrom(ctx); }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof StellarListener ) ((StellarListener)listener).enterFunc(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof StellarListener ) ((StellarListener)listener).exitFunc(this);
+		}
+	}
 	public static class LambdaWithoutArgsExprContext extends Identifier_operandContext {
 		public Lambda_without_argsContext lambda_without_args() {
 			return getRuleContext(Lambda_without_argsContext.class,0);
@@ -2221,13 +2295,13 @@ public class StellarParser extends Parser {
 		enterRule(_localctx, 42, RULE_identifier_operand);
 		int _la;
 		try {
-			setState(261);
-			switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) {
+			setState(278);
+			switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
 			case 1:
 				_localctx = new LogicalConstContext(_localctx);
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(245);
+				setState(261);
 				_la = _input.LA(1);
 				if ( !(_la==TRUE || _la==FALSE) ) {
 				_errHandler.recoverInline(this);
@@ -2240,7 +2314,7 @@ public class StellarParser extends Parser {
 				_localctx = new LambdaWithArgsExprContext(_localctx);
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(246);
+				setState(262);
 				lambda_with_args();
 				}
 				break;
@@ -2248,7 +2322,7 @@ public class StellarParser extends Parser {
 				_localctx = new LambdaWithoutArgsExprContext(_localctx);
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(247);
+				setState(263);
 				lambda_without_args();
 				}
 				break;
@@ -2256,7 +2330,7 @@ public class StellarParser extends Parser {
 				_localctx = new ArithmeticOperandsContext(_localctx);
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(248);
+				setState(264);
 				arithmetic_expr(0);
 				}
 				break;
@@ -2264,7 +2338,7 @@ public class StellarParser extends Parser {
 				_localctx = new StringLiteralContext(_localctx);
 				enterOuterAlt(_localctx, 5);
 				{
-				setState(249);
+				setState(265);
 				match(STRING_LITERAL);
 				}
 				break;
@@ -2272,7 +2346,7 @@ public class StellarParser extends Parser {
 				_localctx = new ListContext(_localctx);
 				enterOuterAlt(_localctx, 6);
 				{
-				setState(250);
+				setState(266);
 				list_entity();
 				}
 				break;
@@ -2280,7 +2354,7 @@ public class StellarParser extends Parser {
 				_localctx = new MapConstContext(_localctx);
 				enterOuterAlt(_localctx, 7);
 				{
-				setState(251);
+				setState(267);
 				map_entity();
 				}
 				break;
@@ -2288,7 +2362,7 @@ public class StellarParser extends Parser {
 				_localctx = new NullConstContext(_localctx);
 				enterOuterAlt(_localctx, 8);
 				{
-				setState(252);
+				setState(268);
 				match(NULL);
 				}
 				break;
@@ -2296,13 +2370,13 @@ public class StellarParser extends Parser {
 				_localctx = new ExistsFuncContext(_localctx);
 				enterOuterAlt(_localctx, 9);
 				{
-				setState(253);
+				setState(269);
 				match(EXISTS);
-				setState(254);
+				setState(270);
 				match(LPAREN);
-				setState(255);
+				setState(271);
 				match(IDENTIFIER);
-				setState(256);
+				setState(272);
 				match(RPAREN);
 				}
 				break;
@@ -2310,14 +2384,22 @@ public class StellarParser extends Parser {
 				_localctx = new CondExpr_parenContext(_localctx);
 				enterOuterAlt(_localctx, 10);
 				{
-				setState(257);
+				setState(273);
 				match(LPAREN);
-				setState(258);
+				setState(274);
 				conditional_expr();
-				setState(259);
+				setState(275);
 				match(RPAREN);
 				}
 				break;
+			case 11:
+				_localctx = new FuncContext(_localctx);
+				enterOuterAlt(_localctx, 11);
+				{
+				setState(277);
+				functions();
+				}
+				break;
 			}
 		}
 		catch (RecognitionException re) {
@@ -2358,13 +2440,13 @@ public class StellarParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(263);
+			setState(280);
 			match(LPAREN);
-			setState(264);
+			setState(281);
 			match(RPAREN);
-			setState(265);
+			setState(282);
 			match(LAMBDA_OP);
-			setState(266);
+			setState(283);
 			transformation_expr();
 			}
 		}
@@ -2410,31 +2492,31 @@ public class StellarParser extends Parser {
 		Lambda_with_argsContext _localctx = new Lambda_with_argsContext(_ctx, getState());
 		enterRule(_localctx, 46, RULE_lambda_with_args);
 		try {
-			setState(278);
+			setState(295);
 			switch (_input.LA(1)) {
 			case LPAREN:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(268);
+				setState(285);
 				match(LPAREN);
-				setState(269);
+				setState(286);
 				lambda_variables();
-				setState(270);
+				setState(287);
 				match(RPAREN);
-				setState(271);
+				setState(288);
 				match(LAMBDA_OP);
-				setState(272);
+				setState(289);
 				transformation_expr();
 				}
 				break;
 			case IDENTIFIER:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(274);
+				setState(291);
 				single_lambda_variable();
-				setState(275);
+				setState(292);
 				match(LAMBDA_OP);
-				setState(276);
+				setState(293);
 				transformation_expr();
 				}
 				break;
@@ -2485,21 +2567,21 @@ public class StellarParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(280);
+			setState(297);
 			lambda_variable();
-			setState(285);
+			setState(302);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while (_la==COMMA) {
 				{
 				{
-				setState(281);
+				setState(298);
 				match(COMMA);
-				setState(282);
+				setState(299);
 				lambda_variable();
 				}
 				}
-				setState(287);
+				setState(304);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -2540,7 +2622,7 @@ public class StellarParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(288);
+			setState(305);
 			lambda_variable();
 			}
 		}
@@ -2577,7 +2659,7 @@ public class StellarParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(290);
+			setState(307);
 			match(IDENTIFIER);
 			}
 		}
@@ -2617,40 +2699,44 @@ public class StellarParser extends Parser {
 	private boolean op_list_sempred(Op_listContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 1:
-			return precpred(_ctx, 3);
+			return precpred(_ctx, 5);
 		case 2:
+			return precpred(_ctx, 3);
+		case 3:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
 	private boolean kv_list_sempred(Kv_listContext _localctx, int predIndex) {
 		switch (predIndex) {
-		case 3:
+		case 4:
+			return precpred(_ctx, 2);
+		case 5:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
 	private boolean arithmetic_expr_sempred(Arithmetic_exprContext _localctx, int predIndex) {
 		switch (predIndex) {
-		case 4:
+		case 6:
 			return precpred(_ctx, 2);
-		case 5:
+		case 7:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
 	private boolean arithmetic_expr_mul_sempred(Arithmetic_expr_mulContext _localctx, int predIndex) {
 		switch (predIndex) {
-		case 6:
+		case 8:
 			return precpred(_ctx, 2);
-		case 7:
+		case 9:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
 
 	public static final String _serializedATN =
-		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3/\u0127\4\2\t\2\4"+
+		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3/\u0138\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -2661,94 +2747,102 @@ public class StellarParser extends Parser {
 		"\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13\u0081\n"+
 		"\13\3\13\3\13\3\13\3\13\7\13\u0087\n\13\f\13\16\13\u008a\13\13\3\f\3\f"+
 		"\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u0096\n\16\3\17\3\17\3\17"+
-		"\5\17\u009b\n\17\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u00a3\n\17\f\17\16"+
-		"\17\u00a6\13\17\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00ae\n\20\3\21\3\21"+
-		"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u00bb\n\21\f\21\16"+
-		"\21\u00be\13\21\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u00c6\n\22\3\23\3\23"+
-		"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u00d1\n\23\f\23\16\23\u00d4\13"+
-		"\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\7\24\u00df\n\24\f\24"+
-		"\16\24\u00e2\13\24\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
-		"\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00f6\n\26\3\27\3\27\3\27"+
-		"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27"+
-		"\u0108\n\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+
-		"\3\31\3\31\3\31\5\31\u0119\n\31\3\32\3\32\3\32\7\32\u011e\n\32\f\32\16"+
-		"\32\u0121\13\32\3\33\3\33\3\34\3\34\3\34\2\7\24\34 $&\35\2\4\6\b\n\f\16"+
-		"\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66\2\4\3\2\16\23\3\2\f\r\u0137"+
-		"\28\3\2\2\2\4E\3\2\2\2\6G\3\2\2\2\bI\3\2\2\2\nK\3\2\2\2\fZ\3\2\2\2\16"+
-		"e\3\2\2\2\20i\3\2\2\2\22s\3\2\2\2\24\u0080\3\2\2\2\26\u008b\3\2\2\2\30"+
-		"\u008d\3\2\2\2\32\u0095\3\2\2\2\34\u009a\3\2\2\2\36\u00ad\3\2\2\2 \u00af"+
-		"\3\2\2\2\"\u00c5\3\2\2\2$\u00c7\3\2\2\2&\u00d5\3\2\2\2(\u00e3\3\2\2\2"+
-		"*\u00f5\3\2\2\2,\u0107\3\2\2\2.\u0109\3\2\2\2\60\u0118\3\2\2\2\62\u011a"+
-		"\3\2\2\2\64\u0122\3\2\2\2\66\u0124\3\2\2\289\5\4\3\29:\7\2\2\3:\3\3\2"+
-		"\2\2;F\5\f\7\2<=\7#\2\2=>\5\4\3\2>?\7$\2\2?F\3\2\2\2@F\5$\23\2AF\5\26"+
-		"\f\2BF\5\24\13\2CF\5\16\b\2DF\5\22\n\2E;\3\2\2\2E<\3\2\2\2E@\3\2\2\2E"+
-		"A\3\2\2\2EB\3\2\2\2EC\3\2\2\2ED\3\2\2\2F\5\3\2\2\2GH\5\16\b\2H\7\3\2\2"+
-		"\2IJ\5\4\3\2J\t\3\2\2\2KL\5\4\3\2L\13\3\2\2\2MN\5\6\4\2NO\7\24\2\2OP\5"+
-		"\b\5\2PQ\7\25\2\2QR\5\n\6\2R[\3\2\2\2ST\7\26\2\2TU\5\6\4\2UV\7\27\2\2"+
-		"VW\5\b\5\2WX\7\30\2\2XY\5\n\6\2Y[\3\2\2\2ZM\3\2\2\2ZS\3\2\2\2[\r\3\2\2"+
-		"\2\\]\5\20\t\2]^\7\t\2\2^_\5\16\b\2_f\3\2\2\2`a\5\20\t\2ab\7\n\2\2bc\5"+
-		"\16\b\2cf\3\2\2\2df\5\20\t\2e\\\3\2\2\2e`\3\2\2\2ed\3\2\2\2f\17\3\2\2"+
-		"\2gj\5\24\13\2hj\5\22\n\2ig\3\2\2\2ih\3\2\2\2j\21\3\2\2\2kl\5,\27\2lm"+
-		"\7\3\2\2mn\5\20\t\2nt\3\2\2\2op\5,\27\2pq\7%\2\2qr\5\20\t\2rt\3\2\2\2"+
-		"sk\3\2\2\2so\3\2\2\2t\23\3\2\2\2uv\b\13\1\2vw\7\13\2\2wx\7#\2\2xy\5\16"+
-		"\b\2yz\7$\2\2z\u0081\3\2\2\2{|\7#\2\2|}\5\16\b\2}~\7$\2\2~\u0081\3\2\2"+
-		"\2\177\u0081\5,\27\2\u0080u\3\2\2\2\u0080{\3\2\2\2\u0080\177\3\2\2\2\u0081"+
-		"\u0088\3\2\2\2\u0082\u0083\f\6\2\2\u0083\u0084\5\30\r\2\u0084\u0085\5"+
-		"\24\13\7\u0085\u0087\3\2\2\2\u0086\u0082\3\2\2\2\u0087\u008a\3\2\2\2\u0088"+
-		"\u0086\3\2\2\2\u0088\u0089\3\2\2\2\u0089\25\3\2\2\2\u008a\u0088\3\2\2"+
-		"\2\u008b\u008c\5,\27\2\u008c\27\3\2\2\2\u008d\u008e\t\2\2\2\u008e\31\3"+
-		"\2\2\2\u008f\u0090\7#\2\2\u0090\u0091\5\34\17\2\u0091\u0092\7$\2\2\u0092"+
-		"\u0096\3\2\2\2\u0093\u0094\7#\2\2\u0094\u0096\7$\2\2\u0095\u008f\3\2\2"+
-		"\2\u0095\u0093\3\2\2\2\u0096\33\3\2\2\2\u0097\u0098\b\17\1\2\u0098\u009b"+
-		"\5,\27\2\u0099\u009b\5\f\7\2\u009a\u0097\3\2\2\2\u009a\u0099\3\2\2\2\u009b"+
-		"\u00a4\3\2\2\2\u009c\u009d\f\5\2\2\u009d\u009e\7\7\2\2\u009e\u00a3\5,"+
-		"\27\2\u009f\u00a0\f\3\2\2\u00a0\u00a1\7\7\2\2\u00a1\u00a3\5\f\7\2\u00a2"+
-		"\u009c\3\2\2\2\u00a2\u009f\3\2\2\2\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2"+
-		"\2\2\u00a4\u00a5\3\2\2\2\u00a5\35\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8"+
-		"\7!\2\2\u00a8\u00ae\7\"\2\2\u00a9\u00aa\7!\2\2\u00aa\u00ab\5\34\17\2\u00ab"+
-		"\u00ac\7\"\2\2\u00ac\u00ae\3\2\2\2\u00ad\u00a7\3\2\2\2\u00ad\u00a9\3\2"+
-		"\2\2\u00ae\37\3\2\2\2\u00af\u00b0\b\21\1\2\u00b0\u00b1\5,\27\2\u00b1\u00b2"+
-		"\7\25\2\2\u00b2\u00b3\5\4\3\2\u00b3\u00bc\3\2\2\2\u00b4\u00b5\f\3\2\2"+
-		"\u00b5\u00b6\7\7\2\2\u00b6\u00b7\5,\27\2\u00b7\u00b8\7\25\2\2\u00b8\u00b9"+
-		"\5\4\3\2\u00b9\u00bb\3\2\2\2\u00ba\u00b4\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc"+
-		"\u00ba\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd!\3\2\2\2\u00be\u00bc\3\2\2\2"+
-		"\u00bf\u00c0\7\37\2\2\u00c0\u00c1\5 \21\2\u00c1\u00c2\7 \2\2\u00c2\u00c6"+
-		"\3\2\2\2\u00c3\u00c4\7\37\2\2\u00c4\u00c6\7 \2\2\u00c5\u00bf\3\2\2\2\u00c5"+
-		"\u00c3\3\2\2\2\u00c6#\3\2\2\2\u00c7\u00c8\b\23\1\2\u00c8\u00c9\5&\24\2"+
-		"\u00c9\u00d2\3\2\2\2\u00ca\u00cb\f\4\2\2\u00cb\u00cc\7\34\2\2\u00cc\u00d1"+
-		"\5&\24\2\u00cd\u00ce\f\3\2\2\u00ce\u00cf\7\33\2\2\u00cf\u00d1\5&\24\2"+
-		"\u00d0\u00ca\3\2\2\2\u00d0\u00cd\3\2\2\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0"+
-		"\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3%\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5"+
-		"\u00d6\b\24\1\2\u00d6\u00d7\5*\26\2\u00d7\u00e0\3\2\2\2\u00d8\u00d9\f"+
-		"\4\2\2\u00d9\u00da\7\36\2\2\u00da\u00df\5&\24\5\u00db\u00dc\f\3\2\2\u00dc"+
-		"\u00dd\7\35\2\2\u00dd\u00df\5&\24\4\u00de\u00d8\3\2\2\2\u00de\u00db\3"+
-		"\2\2\2\u00df\u00e2\3\2\2\2\u00e0\u00de\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1"+
-		"\'\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e3\u00e4\7,\2\2\u00e4\u00e5\5\32\16"+
-		"\2\u00e5)\3\2\2\2\u00e6\u00f6\5(\25\2\u00e7\u00f6\7)\2\2\u00e8\u00f6\7"+
-		"(\2\2\u00e9\u00f6\7+\2\2\u00ea\u00f6\7*\2\2\u00eb\u00f6\7,\2\2\u00ec\u00f6"+
-		"\7\32\2\2\u00ed\u00ee\7#\2\2\u00ee\u00ef\5$\23\2\u00ef\u00f0\7$\2\2\u00f0"+
-		"\u00f6\3\2\2\2\u00f1\u00f2\7#\2\2\u00f2\u00f3\5\f\7\2\u00f3\u00f4\7$\2"+
-		"\2\u00f4\u00f6\3\2\2\2\u00f5\u00e6\3\2\2\2\u00f5\u00e7\3\2\2\2\u00f5\u00e8"+
-		"\3\2\2\2\u00f5\u00e9\3\2\2\2\u00f5\u00ea\3\2\2\2\u00f5\u00eb\3\2\2\2\u00f5"+
-		"\u00ec\3\2\2\2\u00f5\u00ed\3\2\2\2\u00f5\u00f1\3\2\2\2\u00f6+\3\2\2\2"+
-		"\u00f7\u0108\t\3\2\2\u00f8\u0108\5\60\31\2\u00f9\u0108\5.\30\2\u00fa\u0108"+
-		"\5$\23\2\u00fb\u0108\7-\2\2\u00fc\u0108\5\36\20\2\u00fd\u0108\5\"\22\2"+
-		"\u00fe\u0108\7\31\2\2\u00ff\u0100\7&\2\2\u0100\u0101\7#\2\2\u0101\u0102"+
-		"\7,\2\2\u0102\u0108\7$\2\2\u0103\u0104\7#\2\2\u0104\u0105\5\f\7\2\u0105"+
-		"\u0106\7$\2\2\u0106\u0108\3\2\2\2\u0107\u00f7\3\2\2\2\u0107\u00f8\3\2"+
-		"\2\2\u0107\u00f9\3\2\2\2\u0107\u00fa\3\2\2\2\u0107\u00fb\3\2\2\2\u0107"+
-		"\u00fc\3\2\2\2\u0107\u00fd\3\2\2\2\u0107\u00fe\3\2\2\2\u0107\u00ff\3\2"+
-		"\2\2\u0107\u0103\3\2\2\2\u0108-\3\2\2\2\u0109\u010a\7#\2\2\u010a\u010b"+
-		"\7$\2\2\u010b\u010c\7\4\2\2\u010c\u010d\5\4\3\2\u010d/\3\2\2\2\u010e\u010f"+
-		"\7#\2\2\u010f\u0110\5\62\32\2\u0110\u0111\7$\2\2\u0111\u0112\7\4\2\2\u0112"+
-		"\u0113\5\4\3\2\u0113\u0119\3\2\2\2\u0114\u0115\5\64\33\2\u0115\u0116\7"+
-		"\4\2\2\u0116\u0117\5\4\3\2\u0117\u0119\3\2\2\2\u0118\u010e\3\2\2\2\u0118"+
-		"\u0114\3\2\2\2\u0119\61\3\2\2\2\u011a\u011f\5\66\34\2\u011b\u011c\7\7"+
-		"\2\2\u011c\u011e\5\66\34\2\u011d\u011b\3\2\2\2\u011e\u0121\3\2\2\2\u011f"+
-		"\u011d\3\2\2\2\u011f\u0120\3\2\2\2\u0120\63\3\2\2\2\u0121\u011f\3\2\2"+
-		"\2\u0122\u0123\5\66\34\2\u0123\65\3\2\2\2\u0124\u0125\7,\2\2\u0125\67"+
-		"\3\2\2\2\30EZeis\u0080\u0088\u0095\u009a\u00a2\u00a4\u00ad\u00bc\u00c5"+
-		"\u00d0\u00d2\u00de\u00e0\u00f5\u0107\u0118\u011f";
+		"\3\17\5\17\u009c\n\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\7\17"+
+		"\u00a7\n\17\f\17\16\17\u00aa\13\17\3\20\3\20\3\20\3\20\3\20\3\20\5\20"+
+		"\u00b2\n\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u00bd\n"+
+		"\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u00cb"+
+		"\n\21\f\21\16\21\u00ce\13\21\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u00d6"+
+		"\n\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u00e1\n\23\f\23"+
+		"\16\23\u00e4\13\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\7\24\u00ef"+
+		"\n\24\f\24\16\24\u00f2\13\24\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3"+
+		"\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u0106\n\26\3\27"+
+		"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+
+		"\3\27\3\27\5\27\u0119\n\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31"+
+		"\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u012a\n\31\3\32\3\32\3\32\7\32\u012f"+
+		"\n\32\f\32\16\32\u0132\13\32\3\33\3\33\3\34\3\34\3\34\2\7\24\34 $&\35"+
+		"\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66\2\4\3\2\16"+
+		"\23\3\2\f\r\u014d\28\3\2\2\2\4E\3\2\2\2\6G\3\2\2\2\bI\3\2\2\2\nK\3\2\2"+
+		"\2\fZ\3\2\2\2\16e\3\2\2\2\20i\3\2\2\2\22s\3\2\2\2\24\u0080\3\2\2\2\26"+
+		"\u008b\3\2\2\2\30\u008d\3\2\2\2\32\u0095\3\2\2\2\34\u009b\3\2\2\2\36\u00b1"+
+		"\3\2\2\2 \u00bc\3\2\2\2\"\u00d5\3\2\2\2$\u00d7\3\2\2\2&\u00e5\3\2\2\2"+
+		"(\u00f3\3\2\2\2*\u0105\3\2\2\2,\u0118\3\2\2\2.\u011a\3\2\2\2\60\u0129"+
+		"\3\2\2\2\62\u012b\3\2\2\2\64\u0133\3\2\2\2\66\u0135\3\2\2\289\5\4\3\2"+
+		"9:\7\2\2\3:\3\3\2\2\2;F\5\f\7\2<=\7#\2\2=>\5\4\3\2>?\7$\2\2?F\3\2\2\2"+
+		"@F\5$\23\2AF\5\26\f\2BF\5\24\13\2CF\5\16\b\2DF\5\22\n\2E;\3\2\2\2E<\3"+
+		"\2\2\2E@\3\2\2\2EA\3\2\2\2EB\3\2\2\2EC\3\2\2\2ED\3\2\2\2F\5\3\2\2\2GH"+
+		"\5\16\b\2H\7\3\2\2\2IJ\5\4\3\2J\t\3\2\2\2KL\5\4\3\2L\13\3\2\2\2MN\5\6"+
+		"\4\2NO\7\24\2\2OP\5\b\5\2PQ\7\25\2\2QR\5\n\6\2R[\3\2\2\2ST\7\26\2\2TU"+
+		"\5\6\4\2UV\7\27\2\2VW\5\b\5\2WX\7\30\2\2XY\5\n\6\2Y[\3\2\2\2ZM\3\2\2\2"+
+		"ZS\3\2\2\2[\r\3\2\2\2\\]\5\20\t\2]^\7\t\2\2^_\5\16\b\2_f\3\2\2\2`a\5\20"+
+		"\t\2ab\7\n\2\2bc\5\16\b\2cf\3\2\2\2df\5\20\t\2e\\\3\2\2\2e`\3\2\2\2ed"+
+		"\3\2\2\2f\17\3\2\2\2gj\5\24\13\2hj\5\22\n\2ig\3\2\2\2ih\3\2\2\2j\21\3"+
+		"\2\2\2kl\5,\27\2lm\7\3\2\2mn\5\20\t\2nt\3\2\2\2op\5,\27\2pq\7%\2\2qr\5"+
+		"\20\t\2rt\3\2\2\2sk\3\2\2\2so\3\2\2\2t\23\3\2\2\2uv\b\13\1\2vw\7\13\2"+
+		"\2wx\7#\2\2xy\5\16\b\2yz\7$\2\2z\u0081\3\2\2\2{|\7#\2\2|}\5\16\b\2}~\7"+
+		"$\2\2~\u0081\3\2\2\2\177\u0081\5,\27\2\u0080u\3\2\2\2\u0080{\3\2\2\2\u0080"+
+		"\177\3\2\2\2\u0081\u0088\3\2\2\2\u0082\u0083\f\6\2\2\u0083\u0084\5\30"+
+		"\r\2\u0084\u0085\5\24\13\7\u0085\u0087\3\2\2\2\u0086\u0082\3\2\2\2\u0087"+
+		"\u008a\3\2\2\2\u0088\u0086\3\2\2\2\u0088\u0089\3\2\2\2\u0089\25\3\2\2"+
+		"\2\u008a\u0088\3\2\2\2\u008b\u008c\5,\27\2\u008c\27\3\2\2\2\u008d\u008e"+
+		"\t\2\2\2\u008e\31\3\2\2\2\u008f\u0090\7#\2\2\u0090\u0091\5\34\17\2\u0091"+
+		"\u0092\7$\2\2\u0092\u0096\3\2\2\2\u0093\u0094\7#\2\2\u0094\u0096\7$\2"+
+		"\2\u0095\u008f\3\2\2\2\u0095\u0093\3\2\2\2\u0096\33\3\2\2\2\u0097\u0098"+
+		"\b\17\1\2\u0098\u009c\5,\27\2\u0099\u009c\5\f\7\2\u009a\u009c\5\24\13"+
+		"\2\u009b\u0097\3\2\2\2\u009b\u0099\3\2\2\2\u009b\u009a\3\2\2\2\u009c\u00a8"+
+		"\3\2\2\2\u009d\u009e\f\7\2\2\u009e\u009f\7\7\2\2\u009f\u00a7\5,\27\2\u00a0"+
+		"\u00a1\f\5\2\2\u00a1\u00a2\7\7\2\2\u00a2\u00a7\5\f\7\2\u00a3\u00a4\f\3"+
+		"\2\2\u00a4\u00a5\7\7\2\2\u00a5\u00a7\5\24\13\2\u00a6\u009d\3\2\2\2\u00a6"+
+		"\u00a0\3\2\2\2\u00a6\u00a3\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2"+
+		"\2\2\u00a8\u00a9\3\2\2\2\u00a9\35\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab\u00ac"+
+		"\7!\2\2\u00ac\u00b2\7\"\2\2\u00ad\u00ae\7!\2\2\u00ae\u00af\5\34\17\2\u00af"+
+		"\u00b0\7\"\2\2\u00b0\u00b2\3\2\2\2\u00b1\u00ab\3\2\2\2\u00b1\u00ad\3\2"+
+		"\2\2\u00b2\37\3\2\2\2\u00b3\u00b4\b\21\1\2\u00b4\u00b5\5,\27\2\u00b5\u00b6"+
+		"\7\25\2\2\u00b6\u00b7\5\4\3\2\u00b7\u00bd\3\2\2\2\u00b8\u00b9\5\24\13"+
+		"\2\u00b9\u00ba\7\25\2\2\u00ba\u00bb\5\4\3\2\u00bb\u00bd\3\2\2\2\u00bc"+
+		"\u00b3\3\2\2\2\u00bc\u00b8\3\2\2\2\u00bd\u00cc\3\2\2\2\u00be\u00bf\f\4"+
+		"\2\2\u00bf\u00c0\7\7\2\2\u00c0\u00c1\5,\27\2\u00c1\u00c2\7\25\2\2\u00c2"+
+		"\u00c3\5\4\3\2\u00c3\u00cb\3\2\2\2\u00c4\u00c5\f\3\2\2\u00c5\u00c6\7\7"+
+		"\2\2\u00c6\u00c7\5\24\13\2\u00c7\u00c8\7\25\2\2\u00c8\u00c9\5\4\3\2\u00c9"+
+		"\u00cb\3\2\2\2\u00ca\u00be\3\2\2\2\u00ca\u00c4\3\2\2\2\u00cb\u00ce\3\2"+
+		"\2\2\u00cc\u00ca\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd!\3\2\2\2\u00ce\u00cc"+
+		"\3\2\2\2\u00cf\u00d0\7\37\2\2\u00d0\u00d1\5 \21\2\u00d1\u00d2\7 \2\2\u00d2"+
+		"\u00d6\3\2\2\2\u00d3\u00d4\7\37\2\2\u00d4\u00d6\7 \2\2\u00d5\u00cf\3\2"+
+		"\2\2\u00d5\u00d3\3\2\2\2\u00d6#\3\2\2\2\u00d7\u00d8\b\23\1\2\u00d8\u00d9"+
+		"\5&\24\2\u00d9\u00e2\3\2\2\2\u00da\u00db\f\4\2\2\u00db\u00dc\7\34\2\2"+
+		"\u00dc\u00e1\5&\24\2\u00dd\u00de\f\3\2\2\u00de\u00df\7\33\2\2\u00df\u00e1"+
+		"\5&\24\2\u00e0\u00da\3\2\2\2\u00e0\u00dd\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2"+
+		"\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3%\3\2\2\2\u00e4\u00e2\3\2\2\2"+
+		"\u00e5\u00e6\b\24\1\2\u00e6\u00e7\5*\26\2\u00e7\u00f0\3\2\2\2\u00e8\u00e9"+
+		"\f\4\2\2\u00e9\u00ea\7\36\2\2\u00ea\u00ef\5&\24\5\u00eb\u00ec\f\3\2\2"+
+		"\u00ec\u00ed\7\35\2\2\u00ed\u00ef\5&\24\4\u00ee\u00e8\3\2\2\2\u00ee\u00eb"+
+		"\3\2\2\2\u00ef\u00f2\3\2\2\2\u00f0\u00ee\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1"+
+		"\'\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f3\u00f4\7,\2\2\u00f4\u00f5\5\32\16"+
+		"\2\u00f5)\3\2\2\2\u00f6\u0106\5(\25\2\u00f7\u0106\7)\2\2\u00f8\u0106\7"+
+		"(\2\2\u00f9\u0106\7+\2\2\u00fa\u0106\7*\2\2\u00fb\u0106\7,\2\2\u00fc\u0106"+
+		"\7\32\2\2\u00fd\u00fe\7#\2\2\u00fe\u00ff\5$\23\2\u00ff\u0100\7$\2\2\u0100"+
+		"\u0106\3\2\2\2\u0101\u0102\7#\2\2\u0102\u0103\5\f\7\2\u0103\u0104\7$\2"+
+		"\2\u0104\u0106\3\2\2\2\u0105\u00f6\3\2\2\2\u0105\u00f7\3\2\2\2\u0105\u00f8"+
+		"\3\2\2\2\u0105\u00f9\3\2\2\2\u0105\u00fa\3\2\2\2\u0105\u00fb\3\2\2\2\u0105"+
+		"\u00fc\3\2\2\2\u0105\u00fd\3\2\2\2\u0105\u0101\3\2\2\2\u0106+\3\2\2\2"+
+		"\u0107\u0119\t\3\2\2\u0108\u0119\5\60\31\2\u0109\u0119\5.\30\2\u010a\u0119"+
+		"\5$\23\2\u010b\u0119\7-\2\2\u010c\u0119\5\36\20\2\u010d\u0119\5\"\22\2"+
+		"\u010e\u0119\7\31\2\2\u010f\u0110\7&\2\2\u0110\u0111\7#\2\2\u0111\u0112"+
+		"\7,\2\2\u0112\u0119\7$\2\2\u0113\u0114\7#\2\2\u0114\u0115\5\f\7\2\u0115"+
+		"\u0116\7$\2\2\u0116\u0119\3\2\2\2\u0117\u0119\5(\25\2\u0118\u0107\3\2"+
+		"\2\2\u0118\u0108\3\2\2\2\u0118\u0109\3\2\2\2\u0118\u010a\3\2\2\2\u0118"+
+		"\u010b\3\2\2\2\u0118\u010c\3\2\2\2\u0118\u010d\3\2\2\2\u0118\u010e\3\2"+
+		"\2\2\u0118\u010f\3\2\2\2\u0118\u0113\3\2\2\2\u0118\u0117\3\2\2\2\u0119"+
+		"-\3\2\2\2\u011a\u011b\7#\2\2\u011b\u011c\7$\2\2\u011c\u011d\7\4\2\2\u011d"+
+		"\u011e\5\4\3\2\u011e/\3\2\2\2\u011f\u0120\7#\2\2\u0120\u0121\5\62\32\2"+
+		"\u0121\u0122\7$\2\2\u0122\u0123\7\4\2\2\u0123\u0124\5\4\3\2\u0124\u012a"+
+		"\3\2\2\2\u0125\u0126\5\64\33\2\u0126\u0127\7\4\2\2\u0127\u0128\5\4\3\2"+
+		"\u0128\u012a\3\2\2\2\u0129\u011f\3\2\2\2\u0129\u0125\3\2\2\2\u012a\61"+
+		"\3\2\2\2\u012b\u0130\5\66\34\2\u012c\u012d\7\7\2\2\u012d\u012f\5\66\34"+
+		"\2\u012e\u012c\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131"+
+		"\3\2\2\2\u0131\63\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u0134\5\66\34\2\u0134"+
+		"\65\3\2\2\2\u0135\u0136\7,\2\2\u0136\67\3\2\2\2\32EZeis\u0080\u0088\u0095"+
+		"\u009b\u00a6\u00a8\u00b1\u00bc\u00ca\u00cc\u00d5\u00e0\u00e2\u00ee\u00f0"+
+		"\u0105\u0118\u0129\u0130";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {

http://git-wip-us.apache.org/repos/asf/metron/blob/191d5d84/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
index 21b8a1a..aa4462a 100644
--- a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
+++ b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
@@ -218,6 +218,25 @@ public class BasicStellarTest {
     }
   }
 
+  @Test
+  public void testConditionalsAsMapKeys() {
+    {
+      String query = "{ ( RET_TRUE() && y < 50 ) : 'info', y >= 50 : 'warn'}";
+      Map<Boolean, String> ret = (Map)run(query, ImmutableMap.of("y", 50));
+      Assert.assertEquals(ret.size(), 2);
+      Assert.assertEquals("warn", ret.get(true));
+      Assert.assertEquals("info", ret.get(false));
+    }
+  }
+
+
+  @Test
+  public void testConditionalsAsFunctionArgs() {
+    {
+      String query = "RET_TRUE(y < 10)";
+      Assert.assertTrue((boolean)run(query, ImmutableMap.of("y", 50)));
+    }
+  }
 
   @Test
   public void testFunctionEmptyArgs() {