content: /**
   * Copyright (C) 2012 the original author or authors.
   *
   * 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 co.jirm.orm.builder;
  
  import java.util.Map;
  import java.util.Map.Entry;
  
  import com.google.common.collect.ImmutableList;
  import com.google.common.collect.ImmutableMap;
  
  
  
  public abstract class AbstractWhereClauseBuilder<B extends Condition<B>, I> implements MutableCondition<B>  {
  	protected ImmutableCondition condition;
  	
  	protected AbstractWhereClauseBuilder(ImmutableCondition condition) {
  		this.condition = condition;
  	}
  	
  	
  	public ImmutableCondition getCondition() {
  		return condition;
  	}
  
  	@Override
  	public ImmutableList<Object> getParameters() {
  		return this.condition.getParameters();
  	}
  
  	@Override
  	public ImmutableMap<String, Object> getNameParameters() {
  		return this.condition.getNameParameters();
  	}
  	
  	@Override
  	public ImmutableList<Object> mergedParameters() {
  		return this.condition.mergedParameters();
  	}
  	
  	
  	@Override
  	public B and(String sql) {
  		this.condition = this.condition.and(sql);
  		return getSelf();
  	}
  	
  	public B where(String sql) {
  		this.condition = this.condition.and(sql);
  		return getSelf();
  	}
  
  	@Override
  	public B or(String sql) {
  		this.condition = this.condition.or(sql);
  		return getSelf();
  	}
  	
  	public PropertyPath<B> property(String property) {
  		return andProperty(property);
  	}
  	
  	public B property(String property, Object o) {
  		return andProperty(property).eq(o);
  	}
  	
  	public B propertyAll(Map<String, Object> m) {
  		for(Entry<String,Object> e : m.entrySet()) {
  			andProperty(e.getKey()).eq(e.getValue());
  		}
  		return getSelf();
  	}
  	
  	public PropertyPath<B> andProperty(String property) {
  		return PropertyPath.newPropertyPath(property, getSelf(), CombineType.AND);
  	}
  
  	public PropertyPath<B> orProperty(String property) {
  		return PropertyPath.newPropertyPath(property, getSelf(), CombineType.OR);
  
  	}
  	
  	public Field<B> andField(String field) {
  		return Field.newField(field, getSelf(), CombineType.AND);
  	}
  
  	public Field<B> orField(String field) {
  		return Field.newField(field, getSelf(), CombineType.OR);
  
  	}
  	
  	@Override
  	public B not() {
  		this.condition = this.condition.not();
  		return getSelf();
  	}
  
  	@Override
  	public boolean isNoOp() {
  		return this.condition.isNoOp();
  	}
  	
  	
  	@Override
  	public B bind(String key, Object value) {
  		this.condition = this.condition.bind(key, value);
  		return getSelf();
  	}
  	
  	@Override
  	public B with(Object ... value) {
  		this.condition = this.condition.with(value);
  		return getSelf();
  	}
  	
  	protected abstract B getSelf();
  }
  