blob: 59ca2206b85b294ef6f6cdbcbdf21aaa17540790 [file] [log] [blame]
/*****************************************************************
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.cayenne.access.translator.select;
import org.apache.cayenne.access.translator.ParameterBinding;
import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dba.TypesMapping;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.JoinType;
import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.QueryMetadata;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Abstract superclass of Query translators.
*/
public abstract class QueryAssembler {
protected Query query;
protected QueryMetadata queryMetadata;
protected boolean translated;
protected String sql;
protected DbAdapter adapter;
protected EntityResolver entityResolver;
protected List<ParameterBinding> bindings;
/**
* @since 4.0
*/
public QueryAssembler(Query query, DbAdapter adapter, EntityResolver entityResolver) {
this.entityResolver = entityResolver;
this.adapter = adapter;
this.query = query;
this.queryMetadata = query.getMetaData(entityResolver);
this.bindings = new ArrayList<ParameterBinding>();
}
/**
* Returns aliases for the path splits defined in the query.
*
* @since 3.0
*/
protected Map<String, String> getPathAliases() {
return queryMetadata.getPathSplitAliases();
}
public EntityResolver getEntityResolver() {
return entityResolver;
}
public DbAdapter getAdapter() {
return adapter;
}
/**
* Returns query object being processed.
*/
public Query getQuery() {
return query;
}
public QueryMetadata getQueryMetadata() {
return queryMetadata;
}
/**
* A callback invoked by a child qualifier or ordering processor allowing
* query assembler to reset its join stack.
*
* @since 3.0
*/
public abstract void resetJoinStack();
/**
* Returns an alias of the table which is currently at the top of the join
* stack.
*
* @since 3.0
*/
public abstract String getCurrentAlias();
/**
* Appends a join with given semantics to the query.
*
* @since 3.0
*/
public abstract void dbRelationshipAdded(DbRelationship relationship, JoinType joinType, String joinSplitAlias);
/**
* Translates query into an SQL string formatted to use in a
* PreparedStatement.
*/
public String getSql() {
ensureTranslated();
return sql;
}
/**
* @since 4.0
*/
protected void ensureTranslated() {
if (!translated) {
doTranslate();
translated = true;
}
}
/**
* @since 4.0
*/
protected abstract void doTranslate();
/**
* Returns <code>true</code> if table aliases are supported. Default
* implementation returns false.
*/
public boolean supportsTableAliases() {
return false;
}
/**
* Registers <code>anObject</code> as a PreparedStatement parameter.
*
* @param anObject
* object that represents a value of DbAttribute
* @param dbAttr
* DbAttribute being processed.
*/
public void addToParamList(DbAttribute dbAttr, Object anObject) {
String typeName = TypesMapping.getJavaBySqlType(dbAttr.getType());
ExtendedType extendedType = adapter.getExtendedTypes().getRegisteredType(typeName);
ParameterBinding binding = new ParameterBinding(dbAttr, extendedType);
binding.setValue(anObject);
binding.setStatementPosition(bindings.size() + 1);
bindings.add(binding);
}
/**
* @since 4.0
*/
public ParameterBinding[] getBindings() {
return bindings.toArray(new ParameterBinding[bindings.size()]);
}
}