[
https://issues.apache.org/jira/browse/METRON-980?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16042939#comment-16042939
]
ASF GitHub Bot commented on METRON-980:
---------------------------------------
Github user justinleet commented on a diff in the pull request:
https://github.com/apache/metron/pull/606#discussion_r120926071
--- Diff:
metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarCompiler.java
---
@@ -76,14 +93,80 @@ public Expression(Deque<Token<?>> tokenDeque) {
public Object apply(ExpressionState state) {
Deque<Token<?>> instanceDeque = new ArrayDeque<>();
- for(Iterator<Token<?>> it =
getTokenDeque().descendingIterator();it.hasNext();) {
- Token<?> token = it.next();
- if(token.getUnderlyingType() == DeferredFunction.class) {
- DeferredFunction func = (DeferredFunction) token.getValue();
- func.apply(instanceDeque, state);
- }
- else {
- instanceDeque.push(token);
+ {
+ boolean skipElse = false;
+ Token<?> token = null;
+ for (Iterator<Token<?>> it = getTokenDeque().descendingIterator();
it.hasNext(); ) {
+ token = it.next();
+ //if we've skipped an else previously, then we need to skip the
deferred tokens associated with the else.
+ if(skipElse && token.getUnderlyingType() == ElseExpr.class) {
+ while(it.hasNext()) {
+ token = it.next();
+ if(token.getUnderlyingType() == EndConditional.class) {
+ break;
+ }
+ }
+ skipElse = false;
+ }
+ /*
+ curr is the current value on the stack. This is the
non-deferred actual evaluation for this expression
+ and with the current context.
+ */
+ Token<?> curr = instanceDeque.peek();
+ if( curr != null
+ && curr.getValue() != null && curr.getValue() instanceof Boolean
+ &&
ShortCircuitOp.class.isAssignableFrom(token.getUnderlyingType())
+ ) {
+ //if we have a boolean as the current value and the next
non-contextual token is a short circuit op
+ //then we need to short circuit possibly
+ if(token.getUnderlyingType() == BooleanArg.class) {
+ if (curr.getMultiArgContext() != null
+ && curr.getMultiArgContext().getVariety() ==
FrameContext.BOOLEAN_OR
+ && (Boolean) (curr.getValue())
+ ) {
+ //short circuit the or
+ FrameContext.Context context = curr.getMultiArgContext();
+ shortCircuit(it, context);
+ } else if (curr.getMultiArgContext() != null
+ && curr.getMultiArgContext().getVariety() ==
FrameContext.BOOLEAN_AND
+ && !(Boolean) (curr.getValue())
+ ) {
+ //short circuit the and
+ FrameContext.Context context = curr.getMultiArgContext();
+ shortCircuit(it, context);
+ }
+ }
+ else if(token.getUnderlyingType() == IfExpr.class) {
+ //short circuit the if/then/else
+ instanceDeque.pop();
+ if((Boolean)curr.getValue()) {
+ //choose then
+ skipElse = true;
+ }
+ else {
+ //choose else
+ while(it.hasNext()) {
+ Token<?> t = it.next();
+ if(t.getUnderlyingType() == ElseExpr.class) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (token.getUnderlyingType() == DeferredFunction.class) {
+ DeferredFunction func = (DeferredFunction) token.getValue();
+ func.apply(instanceDeque, state);
+ }
+ else if(token.getUnderlyingType() == ShortCircuitFrame.class
+ ||
ShortCircuitOp.class.isAssignableFrom(token.getUnderlyingType())
+ ) {
+ continue;
--- End diff --
`continue;` can be dropped here. There's nothing afterwards to skip
> Short circuit operations for Stellar
> ------------------------------------
>
> Key: METRON-980
> URL: https://issues.apache.org/jira/browse/METRON-980
> Project: Metron
> Issue Type: Improvement
> Reporter: Casey Stella
> Assignee: Casey Stella
>
> Stellar does not currently contain short circuit operations. In most
> languages, this is an important optimization, but for Stellar on Metron, this
> is a requirement due to the fact that some variables may be null legitimately
> and we cannot create multi-line conditionals or temporary variables at the
> moment.
> The short circuit operations supported:
> * short circuited `or` (e.g. true or FUNC(...) would never execute FUNC)
> * short circuited `and` (e.g. false and FUNC(...) would never execute FUNC)
> * short circuited if/then/else (e.g. if true then FUNC(...) else FUNC2(...)
> will never call FUNC2)
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)