package hdgl.db.query.condition; import hdgl.db.exception.HdglException; import hdgl.db.graph.Entity; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Writable; public abstract class AbstractCondition implements Writable{ public static enum ConditionRelationship{ Require, Sufficient, Equivalent, NotRelevant } /** * Test whether "other" is a required condition of this. * meaning that if this is satisfied, "other" is satisfied certainly. * @param other * @return */ public abstract boolean require(AbstractCondition other); /** * Test whether this condition is compatible with "other" * "Compatible" means "Can satisfied at a same time" * @param other * @return */ public abstract boolean compatible(AbstractCondition other); public ConditionRelationship relationship(AbstractCondition other){ if(require(other)){ if(other.require(this)){ return ConditionRelationship.Equivalent; }else{ return ConditionRelationship.Require; } }else{ if(other.require(this)){ return ConditionRelationship.Sufficient; }else{ return ConditionRelationship.NotRelevant; } } } @Override public abstract int hashCode(); @Override public abstract boolean equals(Object obj); public abstract void readTail(DataInput input) throws IOException; public static void writeAbstractCondition(AbstractCondition cond, DataOutput out) throws IOException{ cond.write(out); } @Override public void readFields(DataInput in) throws IOException { in.readByte(); readTail(in); } public abstract boolean test(Entity e); public static AbstractCondition readAbstractCondition(DataInput in) throws IOException{ AbstractCondition cond; byte flagByte = in.readByte(); switch (flagByte) { case Conjunction.FLAG_BYTE: cond = new Conjunction(); break; case EqualTo.FLAG_BYTE: cond = new EqualTo(); break; case LargerThan.FLAG_BYTE: cond = new LargerThan(); break; case LargerThanOrEqualTo.FLAG_BYTE: cond = new LargerThanOrEqualTo(); break; case LessThan.FLAG_BYTE: cond = new LessThan(); break; case LessThanOrEqualTo.FLAG_BYTE: cond = new LessThanOrEqualTo(); break; case NotEqualTo.FLAG_BYTE: cond = new NotEqualTo(); break; case NoRestriction.FLAG_BYTE: cond = new NoRestriction(); break; case OfType.FLAG_BYTE: cond = new OfType(); break; default: throw new HdglException("Unsuppoorted condition type: " + flagByte); } cond.readTail(in); return cond; } }