All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.sadikovi.netflowlib.predicate.Inspectors Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2016 sadikovi
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.github.sadikovi.netflowlib.predicate;

import java.io.Serializable;

/**
 * [[Inspector]] interface is designed to provide methods of resolving predicate values and give
 * an answer on when to skip record. [[ValueInspector]] should be implemented for all basic
 * filters (leaf nodes). Note that [[TrivialPredicate]] does not support value inspector, so
 * `update()` should be run beforehand to optimizie predicate and remove them. [[BinaryLogical]]
 * inspectors are supported by corresponding predicates `And` and `Or`, and [[UnaryLogical]]
 * inspector is backed by `Not` filter.
 * `Inspector` can be used to resolve predicate incrementally, though it depends on design of a
 * caller.
 */
public final class Inspectors {
  private Inspectors() { }

  public static interface Inspector {

    boolean accept(Visitor visitor);
  }

  /** Inspector for leaf nodes, e.g. Eq, Ge, Gt, Le, Lt, In */
  public static class ValueInspector implements Inspector, Serializable {
    public ValueInspector() { }

    public void update(boolean value) { throw new UnsupportedOperationException(); }
    public void update(byte value) { throw new UnsupportedOperationException(); }
    public void update(short value) { throw new UnsupportedOperationException(); }
    public void update(int value) { throw new UnsupportedOperationException(); }
    public void update(long value) { throw new UnsupportedOperationException(); }

    public final void reset() {
      known = false;
      result = false;
    }

    public final void setResult(boolean expression) {
      if (isKnown()) {
        throw new IllegalStateException("Inspector is already known, cannot set result");
      }

      result = expression;
      known = true;
    }

    public final boolean getResult() {
      if (!isKnown()) {
        throw new IllegalStateException("Inspector is not known, cannot return result");
      }

      return result;
    }

    public final boolean isKnown() {
      return known;
    }

    @Override
    public boolean accept(Visitor visitor) {
      return visitor.visit(this);
    }

    private boolean known = false;
    private boolean result = false;
  }

  /** Inspector for binary logical operators, e.g. And, Or */
  static abstract class BinaryLogical implements Inspector, Serializable {
    BinaryLogical() { }

    BinaryLogical(Inspector left, Inspector right) {
      this.left = left;
      this.right = right;
    }

    public final Inspector getLeft() {
      return left;
    }

    public final Inspector getRight() {
      return right;
    }

    private Inspector left;
    private Inspector right;
  }

  public static final class AndInspector extends BinaryLogical {
    public AndInspector(Inspector left, Inspector right) {
      super(left, right);
    }

    @Override
    public boolean accept(Visitor visitor) {
      return visitor.visit(this);
    }
  }

  public static final class OrInspector extends BinaryLogical {
    public OrInspector(Inspector left, Inspector right) {
      super(left, right);
    }

    @Override
    public boolean accept(Visitor visitor) {
      return visitor.visit(this);
    }
  }

  /** Inspector for unary logical operators, e.g. Not */
  static abstract class UnaryLogical implements Inspector, Serializable {
    UnaryLogical(Inspector child) {
      this.child = child;
    }

    public final Inspector getChild() {
      return child;
    }

    private final Inspector child;
  }

  public static final class NotInspector extends UnaryLogical {
    public NotInspector(Inspector child) {
      super(child);
    }

    @Override
    public boolean accept(Visitor visitor) {
      return visitor.visit(this);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy