/**
* Copyright (C) 2010 Michael Mosmann <michael@mosmann.de>
*
* 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 de.flapdoodle.mongoom.datastore.query;
import java.util.Collection;
import java.util.regex.Pattern;
import com.google.common.collect.Lists;
import de.flapdoodle.mongoom.IListQueryOperation;
import de.flapdoodle.mongoom.IQuery;
import de.flapdoodle.mongoom.IQueryOperation;
import de.flapdoodle.mongoom.datastore.factories.IDBObjectFactory;
import de.flapdoodle.mongoom.exceptions.MappingException;
import de.flapdoodle.mongoom.exceptions.NotImplementedException;
import de.flapdoodle.mongoom.mapping.BSONType;
import de.flapdoodle.mongoom.mapping.IContainerTransformation;
import de.flapdoodle.mongoom.mapping.properties.PropertyReference;
public class QueryOperation<T, Q extends IQuery<T>,V> extends AbstractQueryOperation<T, Q, V> implements IQueryOperation<T, Q,V> {
public QueryOperation(Q query, IDBObjectFactory queryBuilder, MappedNameTransformation converter) {
super(query,queryBuilder,converter);
// _query = query;
// _queryBuilder = queryBuilder;
//// _field = asName(fields);
//// _fields = fields;
// _field=converter.name().getMapped();
// _name=converter.name();
//// _converter = converter;
// _transformation=converter.transformation();
}
@Override
public <V> IQueryOperation<T, Q,V> field(PropertyReference<V> field) {
return new QueryOperation<T, Q,V>(_query, _queryBuilder, Queries.getConverter(field, _transformation,_name));
}
@Override
public <C extends Collection<V>, V> IListQueryOperation<T, Q,V> listfield(PropertyReference<C> field) {
return new ListQueryOperation<T, Q,V>(_query, _queryBuilder, Queries.getConverter(field, _transformation,_name));
}
// @Override
public IQueryOperation<T, Q,V> not() {
if (_not)
throw new MappingException("not.not does not make any sense");
_not = !_not;
return this;
}
@Override
public Q eq(V value) {
if (_not)
throw new MappingException("use ne instead of not.eq");
_queryBuilder.set(_field, asObject(getConverter(false),value));
return _query;
}
@Override
public Q match(Pattern pattern) {
// check if dest type is String
asObject(getConverter(false),"");
IDBObjectFactory factory = _queryBuilder.get(_field);
if (_not)
factory = factory.get("$not");
factory.set(_field, pattern);
// _queryBuilder.set(_field, pattern);
return _query;
}
@Override
public Q exists(boolean exists) {
if (_not)
throw new MappingException("use exists(" + !exists + ") instead");
IDBObjectFactory factory = _queryBuilder.get(_field);
// if (_not) factory=factory.get("$not");
factory.set("$exists", exists);
// _queryBuilder.set(_field, "$exists", exists);
return _query;
}
@Override
public Q size(int value) {
IDBObjectFactory factory = _queryBuilder.get(_field);
if (_not)
factory = factory.get("$not");
factory.set("$size", value);
// _queryBuilder.set(_field, "$size", value);
return _query;
}
@Override
public <V> Q type(Class<?> type) {
BSONType bsonType = BSONType.getType(type);
if (bsonType == null)
throw new MappingException("Could not convert " + type + " to BSON Type");
IDBObjectFactory factory = _queryBuilder.get(_field);
if (_not)
factory = factory.get("$not");
factory.set("$type", bsonType.code());
// _queryBuilder.set(_field, "$type", bsonType);
return _query;
}
@Override
public Q mod(int mod, int eq) {
return opList("$mod", false, Lists.newArrayList(mod, eq));
}
@Override
public Q in(V... value) {
if (_not)
throw new MappingException("use nin instead of not.in");
return opList("$in", true, value);
}
@Override
public Q in(Collection<V> values) {
if (_not)
throw new MappingException("use nin instead of not.in");
return opList("$in", true, values);
}
@Override
public Q all(V... value) {
return opList("$all", true, value);
}
@Override
public Q all(Collection<V> values) {
return opList("$all", true, values);
}
@Override
public Q nin(V... value) {
if (_not)
throw new MappingException("use in instead of not.nin");
return opList("$nin", true, value);
}
@Override
public Q nin(Collection<V> values) {
if (_not)
throw new MappingException("use in instead of not.nin");
return opList("$nin", true, values);
}
@Override
public Q ne(V value) {
if (_not)
throw new MappingException("use eq instead of not.ne");
return op("$ne", true, value);
}
@Override
public Q gt(V value) {
if (_not)
throw new MappingException("use lte instead of not.gt");
return op("$gt", true, value);
}
@Override
public Q lt(V value) {
if (_not)
throw new MappingException("use gte instead of not.lt");
return op("$lt", true, value);
}
@Override
public Q gte(V value) {
if (_not)
throw new MappingException("use lt instead of not.gte");
return op("$gte", true, value);
}
@Override
public Q lte(V value) {
if (_not)
throw new MappingException("use gt instead of not.lte");
return op("$lte", true, value);
}
@Override
public SubQuery<T, Q> elemMatch() {
if (_transformation instanceof IContainerTransformation) {
return new SubQuery<T, Q>(_query, ((IContainerTransformation) _transformation).containerConverter(), _queryBuilder.get(
_field).get("$elemMatch"));
}
throw new MappingException("Field " + _field + " is not an List");
}
}