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);
+ }
+}