[ 
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)

Reply via email to