/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.metamodel.query.builder;
import java.util.ArrayList;
import java.util.List;
import org.apache.metamodel.query.FilterItem;
import org.apache.metamodel.query.OperatorType;
import org.apache.metamodel.query.Query;
import org.apache.metamodel.query.QueryParameter;
import org.apache.metamodel.query.SelectItem;
import org.apache.metamodel.schema.Column;
final class WhereBuilderImpl extends AbstractQueryFilterBuilder<SatisfiedWhereBuilder<GroupedQueryBuilder>> implements
WhereBuilder<GroupedQueryBuilder>, SatisfiedWhereBuilder<GroupedQueryBuilder> {
private final Query _query;
private final List<FilterItem> _orFilters;
private FilterItem _parentOrFilter;
public WhereBuilderImpl(Column column, Query query, GroupedQueryBuilder queryBuilder) {
this(new SelectItem(column), query, queryBuilder);
}
public WhereBuilderImpl(SelectItem selectItem, Query query, GroupedQueryBuilder queryBuilder) {
super(selectItem, queryBuilder);
_query = query;
_orFilters = new ArrayList<FilterItem>();
}
public WhereBuilderImpl(Column column, Query query, FilterItem parentOrFilter, List<FilterItem> orFilters,
GroupedQueryBuilder queryBuilder) {
super(new SelectItem(column), queryBuilder);
_query = query;
_parentOrFilter = parentOrFilter;
_orFilters = orFilters;
}
@Override
protected SatisfiedWhereBuilder<GroupedQueryBuilder> applyFilter(FilterItem filter) {
if (_parentOrFilter == null) {
_query.where(filter);
} else {
if (_parentOrFilter.getChildItemCount() == 1) {
_query.getWhereClause().removeItem(_orFilters.get(0));
_query.getWhereClause().addItem(_parentOrFilter);
}
}
_orFilters.add(filter);
return this;
}
@Override
public WhereBuilder<GroupedQueryBuilder> or(String columnName) {
Column column = findColumn(columnName);
return or(column);
}
@Override
public WhereBuilder<GroupedQueryBuilder> or(Column column) {
if (_parentOrFilter == null) {
_parentOrFilter = new FilterItem(_orFilters);
}
return new WhereBuilderImpl(column, _query, _parentOrFilter, _orFilters, getQueryBuilder());
}
@Override
public WhereBuilder<GroupedQueryBuilder> and(String columnName) {
Column column = findColumn(columnName);
return and(column);
}
@Override
public WhereBuilder<GroupedQueryBuilder> and(Column column) {
return getQueryBuilder().where(column);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> eq(QueryParameter queryParameter) {
return isEquals(queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> isEquals(QueryParameter queryParameter) {
if (queryParameter == null) {
throw new IllegalArgumentException("query parameter cannot be null");
}
return _filterBuilder.applyFilter(OperatorType.EQUALS_TO, queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> differentFrom(QueryParameter queryParameter) {
return ne(queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> ne(QueryParameter queryParameter) {
if (queryParameter == null) {
throw new IllegalArgumentException("query parameter cannot be null");
}
return _filterBuilder.applyFilter(OperatorType.DIFFERENT_FROM, queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> greaterThan(QueryParameter queryParameter) {
return gt(queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> gt(QueryParameter queryParameter) {
if (queryParameter == null) {
throw new IllegalArgumentException("query parameter cannot be null");
}
return _filterBuilder.applyFilter(OperatorType.GREATER_THAN, queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> lessThan(QueryParameter queryParameter) {
return lt(queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> lt(QueryParameter queryParameter) {
if (queryParameter == null) {
throw new IllegalArgumentException("query parameter cannot be null");
}
return _filterBuilder.applyFilter(OperatorType.LESS_THAN, queryParameter);
}
@Override
public SatisfiedWhereBuilder<GroupedQueryBuilder> like(QueryParameter queryParameter) {
if (queryParameter == null) {
throw new IllegalArgumentException("query parameter cannot be null");
}
return _filterBuilder.applyFilter(OperatorType.LIKE, queryParameter);
}
}