Skip to content

Package: ResultSetMappingProcessor

ResultSetMappingProcessor

nameinstructionbranchcomplexitylinemethod
ResultSetMappingProcessor(MetamodelBuilder)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
buildConstructorMappers(SparqlResultSetMapping, ResultRowMapper)
M: 0 C: 50
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
buildEntityMappers(SparqlResultSetMapping, ResultRowMapper)
M: 0 C: 45
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
buildMapper(SparqlResultSetMapping)
M: 0 C: 26
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
buildVariableMappers(SparqlResultSetMapping, ResultRowMapper)
M: 0 C: 24
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
createFieldMapper(FieldResult, FieldSpecification)
M: 6 C: 25
81%
M: 1 C: 5
83%
M: 1 C: 3
75%
M: 2 C: 5
71%
M: 0 C: 1
100%
createFieldMapper(FieldSpecification)
M: 0 C: 18
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
generateFieldMappersForFieldResults(EntityResult, EntityType, EntityResultMapper)
M: 0 C: 39
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
generateFieldMappersForUnconfiguredFields(EntityType, EntityResult)
M: 0 C: 41
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
getManager()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getTargetType(EntityResult)
M: 0 C: 27
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
lambda$generateFieldMappersForUnconfiguredFields$0(Set, FieldSpecification)
M: 0 C: 12
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
static {...}
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /**
2: * Copyright (C) 2020 Czech Technical University in Prague
3: * <p>
4: * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
5: * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
6: * version.
7: * <p>
8: * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
9: * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
10: * details. You should have received a copy of the GNU General Public License along with this program. If not, see
11: * <http://www.gnu.org/licenses/>.
12: */
13: package cz.cvut.kbss.jopa.query.mapper;
14:
15: import cz.cvut.kbss.jopa.exception.SparqlResultMappingException;
16: import cz.cvut.kbss.jopa.model.annotations.*;
17: import cz.cvut.kbss.jopa.model.metamodel.*;
18: import cz.cvut.kbss.jopa.query.ResultSetMappingManager;
19: import org.slf4j.Logger;
20: import org.slf4j.LoggerFactory;
21:
22: import java.util.*;
23: import java.util.stream.Collectors;
24:
25: /**
26: * Builds mappers for {@link SparqlResultSetMapping} instances discovered on classpath.
27: */
28: public class ResultSetMappingProcessor {
29:
30: private static final Logger LOG = LoggerFactory.getLogger(ResultSetMappingProcessor.class);
31:
32: private final ResultSetMappingManager manager = new ResultSetMappingManager();
33:
34: private final MetamodelBuilder metamodelBuilder;
35:
36: public ResultSetMappingProcessor(MetamodelBuilder metamodelBuilder) {
37: this.metamodelBuilder = metamodelBuilder;
38: }
39:
40: /**
41: * Builds result set mapper for the specified mapping.
42: *
43: * @param mapping Mapping configuration
44: */
45: public void buildMapper(SparqlResultSetMapping mapping) {
46: Objects.requireNonNull(mapping);
47: final ResultRowMapper rowMapper = new ResultRowMapper(mapping.name());
48: buildVariableMappers(mapping, rowMapper);
49: buildConstructorMappers(mapping, rowMapper);
50: buildEntityMappers(mapping, rowMapper);
51: manager.addMapper(rowMapper.getName(), rowMapper);
52: }
53:
54: private static void buildVariableMappers(SparqlResultSetMapping mapping, ResultRowMapper parent) {
55:• for (VariableResult vr : mapping.variables()) {
56: parent.addMapper(new VariableResultMapper(vr));
57: }
58: }
59:
60: private static void buildConstructorMappers(SparqlResultSetMapping mapping, ResultRowMapper parent) {
61:• for (ConstructorResult cr : mapping.classes()) {
62: final ConstructorResultMapper mapper = new ConstructorResultMapper(cr.targetClass());
63:• for (VariableResult vr : cr.variables()) {
64: mapper.addParameterMapper(new VariableResultMapper(vr));
65: }
66: parent.addMapper(mapper);
67: }
68: }
69:
70: private void buildEntityMappers(SparqlResultSetMapping mapping, ResultRowMapper parent) {
71:• for (EntityResult er : mapping.entities()) {
72: final EntityType<?> et = getTargetType(er);
73: final EntityResultMapper<?> etMapper = new EntityResultMapper<>(et);
74: generateFieldMappersForFieldResults(er, et, etMapper);
75: generateFieldMappersForUnconfiguredFields(et, er).forEach(etMapper::addFieldMapper);
76: parent.addMapper(etMapper);
77: }
78: }
79:
80: private EntityType<?> getTargetType(EntityResult er) {
81: final AbstractIdentifiableType<?> targetType = metamodelBuilder.entity(er.entityClass());
82:• if (!(targetType instanceof EntityType)) {
83: throw new SparqlResultMappingException(
84: "Type " + er.entityClass() +
85: " is not a known entity type and cannot be used as @EntityResult target class.");
86: }
87: return (EntityType<?>) targetType;
88: }
89:
90: private void generateFieldMappersForFieldResults(EntityResult er, EntityType<?> et,
91: EntityResultMapper<?> etMapper) {
92:• for (FieldResult fr : er.fields()) {
93: try {
94: final FieldSpecification<?, ?> fieldSpec = et.getFieldSpecification(fr.name());
95: createFieldMapper(fr, fieldSpec).ifPresent(etMapper::addFieldMapper);
96: } catch (IllegalArgumentException e) {
97: throw new SparqlResultMappingException(e);
98: }
99: }
100: }
101:
102: private static Optional<FieldResultMapper> createFieldMapper(FieldResult fr, FieldSpecification<?, ?> fieldSpec) {
103:• if (fieldSpec.isCollection()) {
104: LOG.warn(
105: "Mapping of plural attributes via @FieldResult is not supported. Check the definition of {}.",
106: fr);
107: return Optional.empty();
108: }
109:• if (fieldSpec instanceof Attribute &&
110:• ((Attribute) fieldSpec).getPersistentAttributeType() == Attribute.PersistentAttributeType.OBJECT) {
111: return Optional.of(new ObjectPropertyFieldResultMapper(fr, fieldSpec));
112: } else {
113: return Optional.of(new FieldResultMapper(fr, fieldSpec));
114: }
115: }
116:
117: private List<FieldResultMapper> generateFieldMappersForUnconfiguredFields(EntityType<?> et, EntityResult er) {
118: final Set<String> configuredFields = new HashSet<>(er.fields().length);
119:• for (FieldResult fr : er.fields()) {
120: configuredFields.add(fr.name());
121: }
122: return et.getFieldSpecifications().stream()
123:• .filter(fs -> !configuredFields.contains(fs.getName()) && !fs.isCollection())
124: .map(ResultSetMappingProcessor::createFieldMapper)
125: .collect(Collectors.toList());
126: }
127:
128: private static FieldResultMapper createFieldMapper(FieldSpecification<?, ?> fieldSpec) {
129:• if (fieldSpec instanceof Attribute &&
130:• ((Attribute) fieldSpec).getPersistentAttributeType() == Attribute.PersistentAttributeType.OBJECT) {
131: return new ObjectPropertyFieldResultMapper(fieldSpec);
132: } else {
133: return new FieldResultMapper(fieldSpec);
134: }
135: }
136:
137: public ResultSetMappingManager getManager() {
138: return manager;
139: }
140: }