/*****************************************************************
* 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.cayenne.map;
import org.apache.cayenne.reflect.ClassDescriptor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* A metadata object that defines how a row in a result set can be converted to
* result objects. SQLResult can be mapped to a single scalar, a single entity
* or a mix of scalars and entities that is represented as an Object[].
*
* @since 3.0
*/
public class SQLResult {
protected String name;
protected List<Object> resultDescriptors;
/**
* Creates an unnamed SQLResultSet.
*/
public SQLResult() {
}
public List<Object> getResolvedComponents(EntityResolver resolver) {
if (resultDescriptors == null) {
return Collections.emptyList();
}
List<Object> resolvedComponents = new ArrayList<>(resultDescriptors.size());
int offset = 0;
for (Object component : getComponents()) {
if (component instanceof String) {
resolvedComponents.add(new DefaultScalarResultSegment((String) component, offset));
offset = offset + 1;
} else if (component instanceof EntityResult) {
EntityResult entityResult = (EntityResult) component;
Map<String, String> fields = entityResult.getDbFields(resolver);
String entityName = entityResult.getEntityName();
if (entityName == null) {
entityName = resolver.getObjEntity(entityResult.getEntityClass()).getName();
}
ClassDescriptor classDescriptor = resolver.getClassDescriptor(entityName);
resolvedComponents.add(new DefaultEntityResultSegment(classDescriptor, fields, offset));
offset = offset + fields.size();
} else {
throw new IllegalArgumentException("Unsupported result descriptor component: " + component);
}
}
return resolvedComponents;
}
/**
* Creates a named SQLResultSet.
*/
public SQLResult(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* Returns a list of "uncompiled" result descriptors. Column descriptors are
* returned as Strings, entity descriptors - as {@link EntityResult}. To get
* fully resolved descriptors, use
* {@link #getResolvedComponents(EntityResolver)}.
*/
public List<Object> getComponents() {
return resultDescriptors != null ? resultDescriptors : Collections.emptyList();
}
public void addEntityResult(EntityResult entityResult) {
if (resultDescriptors == null) {
resultDescriptors = new ArrayList<>(3);
}
resultDescriptors.add(entityResult);
}
/**
* Adds a result set column name to the mapping.
*/
public void addColumnResult(String column) {
if (resultDescriptors == null) {
resultDescriptors = new ArrayList<>(3);
}
resultDescriptors.add(column);
}
}