package jef.database.query;
import jef.database.Condition;
import jef.database.Condition.Operator;
import jef.database.IConditionField.And;
import jef.database.IConditionField.Or;
import jef.database.IQueryableEntity;
public class TermsEnd {
private ConditionAccessor context;
private Condition lastCond;
private Query<?> query;
private Terms parent;
public TermsEnd(ConditionAccessor lastContainer,Query<?> q,Terms parent) {
this.context=lastContainer;
this.query=q;
this.parent=parent;
}
public TermsConnector or() {
if(parent instanceof TermsConnector){
TermsConnector connector=(TermsConnector)parent;
if(!connector.bracket){
if(connector.level()==1){
return connector;
}else{//OR的优先级小于END (>1)
Terms terms=connector.getParent();
return terms.end.set(connector.getWrappedCondition()).or();
}
}
}
if(context.remove(lastCond)){
Or or=new Or();
or.addCondition(lastCond);
Condition cond=Condition.get(or, Operator.EQUALS, null);
context.add(cond);
return new TermsConnector(new ConditionAccessor.I(or,cond),query,1,parent);
}else{
throw new IllegalStateException();
}
}
public TermsConnector and() {
if(parent instanceof TermsConnector){
TermsConnector connector=(TermsConnector)parent;
if(!connector.bracket){
if(connector.level()==2){
return (TermsConnector)parent;
}else if(connector.level()>2){//not
Terms terms=connector.getParent();
return terms.end.set(connector.getWrappedCondition()).and();
}
}
}
if(context.remove(lastCond)){
And and=new And();
and.addCondition(lastCond);
Condition cond=Condition.get(and, Operator.EQUALS, null);
context.add(cond);
return new TermsConnector(new ConditionAccessor.I(and,cond),query,2,parent);
}else{
throw new IllegalStateException();
}
}
public TermsEnd set(Condition cond) {
lastCond=cond;
return this;
}
public TermsEnd R$() {
if(parent instanceof TermsConnector){
TermsConnector connector=(TermsConnector)parent;
if(connector.getParent().isBracket()){
((TermsConnector)connector.getParent()).bracket=false;
}
return connector.getParent().end.set(connector.getWrappedCondition());
}
return this;
}
@SuppressWarnings("unchecked")
public <T extends IQueryableEntity> Query<T> build(){
return (Query<T>)query;
}
}