diff --git a/pom.xml b/pom.xml index 69e9b3a..f46d4d2 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 11 4.3.1 3.0.2 - 0.8.2 + 0.8.3 diff --git a/src/main/java/org/dcsa/core/controller/ExtendedBaseController.java b/src/main/java/org/dcsa/core/controller/ExtendedBaseController.java index 7969bc3..c646e4b 100644 --- a/src/main/java/org/dcsa/core/controller/ExtendedBaseController.java +++ b/src/main/java/org/dcsa/core/controller/ExtendedBaseController.java @@ -24,9 +24,13 @@ public String getType() { return getService().getModelClass().getSimpleName(); } - @GetMapping() + protected ExtendedRequest newExtendedRequest() { + return new ExtendedRequest<>(extendedParameters, r2dbcDialect, getService().getModelClass()); + } + + @GetMapping public Flux findAll(ServerHttpResponse response, ServerHttpRequest request) { - ExtendedRequest extendedRequest = new ExtendedRequest<>(extendedParameters, r2dbcDialect, getService().getModelClass()); + ExtendedRequest extendedRequest = newExtendedRequest(); try { extendedRequest.parseParameter(request.getQueryParams()); } catch (GetException getException) { diff --git a/src/main/java/org/dcsa/core/extendedrequest/TableAndJoins.java b/src/main/java/org/dcsa/core/extendedrequest/TableAndJoins.java index 7e495ec..e07f001 100644 --- a/src/main/java/org/dcsa/core/extendedrequest/TableAndJoins.java +++ b/src/main/java/org/dcsa/core/extendedrequest/TableAndJoins.java @@ -20,10 +20,12 @@ public class TableAndJoins { private final Table primaryTable; private final Set knownAliases = new HashSet<>(); private final LinkedHashMap joins = new LinkedHashMap<>(); + private final String primaryTableAlias; public TableAndJoins(Table primaryTable) { this.primaryTable = primaryTable; - knownAliases.add(ReflectUtility.getAliasId(primaryTable)); + primaryTableAlias = ReflectUtility.getAliasId(primaryTable); + knownAliases.add(primaryTableAlias); } public void addJoinDescriptor(JoinDescriptor joinDescriptor) { @@ -41,41 +43,6 @@ public JoinDescriptor getJoinDescriptor(String aliasId) { return joins.get(aliasId); } - private static void applyJoinToStringBuilder(StringBuilder sb, JoinDescriptor descriptor) { - Column lhs = descriptor.getLHSColumn(); - Column rhs = descriptor.getRHSColumn(); - Table table = descriptor.getRHSTable(); - String joinLine = table.toString() + " ON " + lhs.toString() + "=" + rhs.toString(); - switch (descriptor.getJoinType()) { - case JOIN: - sb.append(" JOIN "); - break; - case LEFT_OUTER_JOIN: - sb.append(" LEFT JOIN "); - break; - case RIGHT_OUTER_JOIN: - throw new UnsupportedOperationException("Rewrite to use LEFT JOIN instead"); - default: - throw new UnsupportedOperationException("Unsupported join type: " + descriptor.getJoinType()); - } - sb.append(joinLine); - } - - protected void generateFromAndJoins(StringBuilder sb, Set selectedJoinAliases) { - int selectedJoins = 0; - sb.append(" FROM "); - sb.append(primaryTable.toString()); - for (JoinDescriptor joinDescriptor : joins.values()) { - if (selectedJoinAliases.contains(joinDescriptor.getJoinAliasId())) { - applyJoinToStringBuilder(sb, joinDescriptor); - selectedJoins++; - } - } - if (selectedJoinAliases.size() != selectedJoins) { - throw new IllegalArgumentException("selectedJoinAliases contained an unknown alias"); - } - } - public boolean hasJoins() { return !joins.isEmpty(); } @@ -92,6 +59,10 @@ public SelectBuilder.SelectFromAndJoinCondition applyJoins(SelectBuilder.SelectF selectedJoins++; } } + // "Forgive" if the primary table is included as well. + if (selectedJoinAliases.contains(primaryTableAlias)) { + selectedJoins++; + } if (selectedJoinAliases.size() != selectedJoins) { throw new IllegalArgumentException("selectedJoinAliases contained an unknown alias"); } diff --git a/src/main/java/org/dcsa/core/repository/InsertAddonRepository.java b/src/main/java/org/dcsa/core/repository/InsertAddonRepository.java new file mode 100644 index 0000000..6d633d1 --- /dev/null +++ b/src/main/java/org/dcsa/core/repository/InsertAddonRepository.java @@ -0,0 +1,12 @@ +package org.dcsa.core.repository; + +import reactor.core.publisher.Mono; + +public interface InsertAddonRepository { + + /** + * Unsafe create that enables you to insert an entity with a predefined + * ID. + */ + Mono insert(T t); +} diff --git a/src/main/java/org/dcsa/core/repository/InsertAddonRepositoryImpl.java b/src/main/java/org/dcsa/core/repository/InsertAddonRepositoryImpl.java new file mode 100644 index 0000000..f6f4fe4 --- /dev/null +++ b/src/main/java/org/dcsa/core/repository/InsertAddonRepositoryImpl.java @@ -0,0 +1,18 @@ +package org.dcsa.core.repository; + +import org.springframework.data.r2dbc.core.R2dbcEntityOperations; +import reactor.core.publisher.Mono; + +public class InsertAddonRepositoryImpl implements InsertAddonRepository { + + private final R2dbcEntityOperations entityOperations; + + public InsertAddonRepositoryImpl(R2dbcEntityOperations entityOperations) { + this.entityOperations = entityOperations; + } + + @Override + public Mono insert(T t) { + return entityOperations.insert(t); + } +}