/*
NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org
"This file is part of the NeoDatis ODB open source object database".
NeoDatis ODB is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
NeoDatis ODB is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.neodatis.odb.core.query;
import org.neodatis.odb.ODBRuntimeException;
import org.neodatis.odb.core.NeoDatisError;
import org.neodatis.odb.core.layers.layer2.instance.IInstanceBuilder;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfo;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.core.query.execution.IQueryExecutor;
import org.neodatis.odb.core.query.execution.MultiClassGenericQueryExecutor;
import org.neodatis.odb.core.query.nq.NativeQuery;
import org.neodatis.odb.core.query.nq.SimpleNativeQuery;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQueryExecutor;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQueryManager;
import org.neodatis.odb.impl.core.query.nq.NativeQueryExecutor;
import org.neodatis.odb.impl.core.query.nq.NativeQueryManager;
import org.neodatis.odb.impl.core.query.values.ValuesCriteriaQuery;
import org.neodatis.odb.impl.core.query.values.ValuesCriteriaQueryExecutor;
public class QueryManager {
public static boolean needsInstanciation(IQuery query) {
if (NativeQuery.class.isAssignableFrom(query.getClass())) {
return true;
}
if (SimpleNativeQuery.class.isAssignableFrom(query.getClass())) {
return true;
}
if (CriteriaQuery.class == query.getClass() || ValuesCriteriaQuery.class == query.getClass()) {
return false;
}
throw new ODBRuntimeException(NeoDatisError.QUERY_TYPE_NOT_IMPLEMENTED.addParameter(query.getClass().getName()));
}
public static boolean isCriteriaQuery(IQuery query) {
return CriteriaQuery.class.isAssignableFrom(query.getClass());
}
public static int[] getOrderByAttributeIds(ClassInfo classInfo, IQuery query) {
String[] fieldNames = query.getOrderByFieldNames();
int[] fieldIds = new int[fieldNames.length];
for (int i = 0; i < fieldNames.length; i++) {
fieldIds[i] = classInfo.getAttributeId(fieldNames[i]);
}
return fieldIds;
}
/**
* Returns a query executor according to the query type
*
* @param query
* @param engine
* @param instanceBuilder
* @return
*/
public static IQueryExecutor getQueryExecutor(IQuery query, IStorageEngine engine, IInstanceBuilder instanceBuilder) {
if (query.isPolymorphic()) {
return getMultiClassQueryExecutor(query, engine, instanceBuilder);
}
return getSingleClassQueryExecutor(query, engine, instanceBuilder);
}
/**
* Return a single class query executor (polymorphic = false)
*
* @param query
* @param engine
* @param instanceBuilder
* @return
*/
protected static IQueryExecutor getSingleClassQueryExecutor(IQuery query, IStorageEngine engine, IInstanceBuilder instanceBuilder) {
if (CriteriaQuery.class == query.getClass()) {
return new CriteriaQueryExecutor(query, engine);
}
if (ValuesCriteriaQuery.class == query.getClass()) {
return new ValuesCriteriaQueryExecutor(query, engine);
}
if (NativeQuery.class.isAssignableFrom(query.getClass())) {
return new NativeQueryExecutor(query, engine, instanceBuilder);
}
if (SimpleNativeQuery.class.isAssignableFrom(query.getClass())) {
return new NativeQueryExecutor(query, engine, instanceBuilder);
}
throw new ODBRuntimeException(NeoDatisError.QUERY_TYPE_NOT_IMPLEMENTED.addParameter(query.getClass().getName()));
}
/**
* Returns a multi class query executor (polymorphic = true)
*
* @param query
* @param engine
* @param instanceBuilder
* @return
*/
protected static IQueryExecutor getMultiClassQueryExecutor(IQuery query, IStorageEngine engine, IInstanceBuilder instanceBuilder) {
if (CriteriaQuery.class == query.getClass()) {
return new MultiClassGenericQueryExecutor(new CriteriaQueryExecutor(query, engine));
}
if (ValuesCriteriaQuery.class == query.getClass()) {
return new MultiClassGenericQueryExecutor(new ValuesCriteriaQueryExecutor(query, engine));
}
if (NativeQuery.class.isAssignableFrom(query.getClass())) {
return new MultiClassGenericQueryExecutor(new NativeQueryExecutor(query, engine, instanceBuilder));
}
if (SimpleNativeQuery.class.isAssignableFrom(query.getClass())) {
return new MultiClassGenericQueryExecutor(new NativeQueryExecutor(query, engine, instanceBuilder));
}
throw new ODBRuntimeException(NeoDatisError.QUERY_TYPE_NOT_IMPLEMENTED.addParameter(query.getClass().getName()));
}
/**
* @param query
* @return
*/
public static String getFullClassName(IQuery query) {
if (NativeQuery.class.isAssignableFrom(query.getClass())) {
return new NativeQueryManager().getFullClassName((NativeQuery) query);
}
if (SimpleNativeQuery.class.isAssignableFrom(query.getClass())) {
return new NativeQueryManager().getFullClassName((SimpleNativeQuery) query);
}
if (CriteriaQuery.class == query.getClass() || ValuesCriteriaQuery.class == query.getClass()) {
return new CriteriaQueryManager().getFullClassName((CriteriaQuery) query);
}
throw new ODBRuntimeException(NeoDatisError.QUERY_TYPE_NOT_IMPLEMENTED.addParameter(query.getClass().getName()));
}
}
Ads help maintain this website.