// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Columns.java
// public static abstract class Column implements Serializable, Statistics {
//   Column() { }
// 
//   Column(String name, Class<?> type, int offset) {
//     if (offset < 0) {
//       throw new IllegalArgumentException("Wrong offset " + offset);
//     }
// 
//     columnName = name;
//     columnType = type;
//     columnOffset = offset;
//   }
// 
//   /** Get column name */
//   public String getColumnName() {
//     return columnName;
//   }
// 
//   /** Get column type */
//   public Class<?> getColumnType() {
//     return columnType;
//   }
// 
//   /** Get column offset in a record */
//   public int getColumnOffset() {
//     return columnOffset;
//   }
// 
//   /** Read field from byte buffer and return value that confirms to column class */
//   public abstract Object readField(WrappedByteBuf buffer);
// 
//   /** Update value inspector with value from buffer */
//   public abstract void updateValueInspector(WrappedByteBuf buffer, ValueInspector vi);
// 
//   @Override
//   public String toString() {
//     return getClass().getSimpleName() + "(name=" + columnName + ", offset=" + columnOffset + ")";
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) return true;
//     if (obj == null || getClass() != obj.getClass()) return false;
// 
//     Column that = (Column) obj;
// 
//     if (!columnType.equals(that.columnType)) return false;
//     if (!columnName.equals(that.columnName)) return false;
//     if (columnOffset != that.columnOffset) return false;
// 
//     return true;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = columnName.hashCode();
//     result = 31 * result + columnType.hashCode();
//     result = 31 * result + columnOffset;
//     return result;
//   }
// 
//   private String columnName = null;
//   private Class<?> columnType = null;
//   private int columnOffset = -1;
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// public static interface Inspector {
// 
//   boolean accept(Visitor visitor);
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// public static final class NotInspector extends UnaryLogical {
//   public NotInspector(Inspector child) {
//     super(child);
//   }
// 
//   @Override
//   public boolean accept(Visitor visitor) {
//     return visitor.visit(this);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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;
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/statistics/Statistics.java
// public abstract interface Statistics {
//   public Object getMin();
// 
//   public Object getMax();
// }


import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import com.github.sadikovi.netflowlib.predicate.Columns.Column;
import com.github.sadikovi.netflowlib.predicate.Inspectors.Inspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.AndInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.NotInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.OrInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.ValueInspector;
import com.github.sadikovi.netflowlib.statistics.Statistics;
    @Override
    public int hashCode() {
      int result = child.hashCode();
      result = 31 * result + getClass().hashCode();
      return result;
    }

    private final FilterPredicate child;
  }

  //////////////////////////////////////////////////////////////
  // Concrete implementation of unary logical predicate (Not)
  //////////////////////////////////////////////////////////////

  /** "Not" inversion operator */
  public static final class Not extends UnaryLogicalPredicate {
    Not(FilterPredicate child) {
      super(child);
    }

    @Override
    public FilterPredicate update(
        PredicateTransform transformer,
        HashMap<String, Statistics> statistics) {
      Not copy = new Not(getChild().update(transformer, statistics));
      return transformer.transform(copy);
    }

    @Override
    public Inspector convert() {
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Columns.java
// public static abstract class Column implements Serializable, Statistics {
//   Column() { }
// 
//   Column(String name, Class<?> type, int offset) {
//     if (offset < 0) {
//       throw new IllegalArgumentException("Wrong offset " + offset);
//     }
// 
//     columnName = name;
//     columnType = type;
//     columnOffset = offset;
//   }
// 
//   /** Get column name */
//   public String getColumnName() {
//     return columnName;
//   }
// 
//   /** Get column type */
//   public Class<?> getColumnType() {
//     return columnType;
//   }
// 
//   /** Get column offset in a record */
//   public int getColumnOffset() {
//     return columnOffset;
//   }
// 
//   /** Read field from byte buffer and return value that confirms to column class */
//   public abstract Object readField(WrappedByteBuf buffer);
// 
//   /** Update value inspector with value from buffer */
//   public abstract void updateValueInspector(WrappedByteBuf buffer, ValueInspector vi);
// 
//   @Override
//   public String toString() {
//     return getClass().getSimpleName() + "(name=" + columnName + ", offset=" + columnOffset + ")";
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (this == obj) return true;
//     if (obj == null || getClass() != obj.getClass()) return false;
// 
//     Column that = (Column) obj;
// 
//     if (!columnType.equals(that.columnType)) return false;
//     if (!columnName.equals(that.columnName)) return false;
//     if (columnOffset != that.columnOffset) return false;
// 
//     return true;
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = columnName.hashCode();
//     result = 31 * result + columnType.hashCode();
//     result = 31 * result + columnOffset;
//     return result;
//   }
// 
//   private String columnName = null;
//   private Class<?> columnType = null;
//   private int columnOffset = -1;
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// public static interface Inspector {
// 
//   boolean accept(Visitor visitor);
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// public static final class NotInspector extends UnaryLogical {
//   public NotInspector(Inspector child) {
//     super(child);
//   }
// 
//   @Override
//   public boolean accept(Visitor visitor) {
//     return visitor.visit(this);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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);
//   }
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Inspectors.java
// 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;
// }
// 
// Path: src/main/java/com/github/sadikovi/netflowlib/statistics/Statistics.java
// public abstract interface Statistics {
//   public Object getMin();
// 
//   public Object getMax();
// }


// Path: src/main/java/com/github/sadikovi/netflowlib/predicate/Operators.java
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import com.github.sadikovi.netflowlib.predicate.Columns.Column;
import com.github.sadikovi.netflowlib.predicate.Inspectors.Inspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.AndInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.NotInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.OrInspector;
import com.github.sadikovi.netflowlib.predicate.Inspectors.ValueInspector;
import com.github.sadikovi.netflowlib.statistics.Statistics;

    @Override
    public int hashCode() {
      int result = child.hashCode();
      result = 31 * result + getClass().hashCode();
      return result;
    }

    private final FilterPredicate child;
  }

  //////////////////////////////////////////////////////////////
  // Concrete implementation of unary logical predicate (Not)
  //////////////////////////////////////////////////////////////

  /** "Not" inversion operator */
  public static final class Not extends UnaryLogicalPredicate {
    Not(FilterPredicate child) {
      super(child);
    }

    @Override
    public FilterPredicate update(
        PredicateTransform transformer,
        HashMap<String, Statistics> statistics) {
      Not copy = new Not(getChild().update(transformer, statistics));
      return transformer.transform(copy);
    }

    @Override
    public Inspector convert() {
      return new NotInspector(getChild().convert());