From fa634504959dc9f97f351c4eb1d79097e01b9b54 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Thu, 12 Nov 2020 17:10:08 +0000 Subject: [PATCH] f-fix-deleted-old-reference -> dev --- CHANGELOG.md | 6 ++++++ .../caosdb/server/database/DatabaseUtils.java | 21 ++++++++++++++++--- .../transaction/RetrieveFullEntity.java | 2 +- .../java/org/caosdb/server/entity/Entity.java | 3 ++- .../server/entity/wrapper/Property.java | 2 +- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a38468f9..e9c9bf02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +* Semi-fixed a bug which occurs when retrieving old versions of entities which + reference entities which have been deleted in the mean time. The current fix + adds a warning message to the reference property in question and sets the + value to NULL. This might even be desired behavior, however this would have + to finally specified during the Delete/Forget phase of the implementation of + the versioning. - Inheritance job cannot handle inheritance from same container (!54) * Bug in the query parser (MR!56) - The parser would throw an error when the query contains a conjunction or disjunction filter with a first element which diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java index c985c1b9..d5910eb9 100644 --- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java +++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java @@ -258,7 +258,8 @@ public class DatabaseUtils { } } - private static void replace(final Property p, final HashMap<Integer, Property> domainMap) { + private static void replace( + final Property p, final HashMap<Integer, Property> domainMap, boolean isHead) { // ... find the corresponding domain and replace it ReferenceValue ref; try { @@ -267,6 +268,17 @@ public class DatabaseUtils { throw new RuntimeException("This should never happen."); } final EntityInterface replacement = domainMap.get((ref.getId())); + if (replacement == null) { + if (isHead) { + throw new NullPointerException("Replacement was null"); + } + // entity has been deleted (we are processing properties of an old entity version) + p.setValue(null); + p.addWarning( + new Message( + "The referenced entity has been deleted in the mean time and is not longer available.")); + return; + } if (replacement.isDescOverride()) { p.setDescOverride(true); p.setDescription(replacement.getDescription()); @@ -314,15 +326,18 @@ public class DatabaseUtils { } // loop over all properties + boolean isHead = + e.getVersion().getSuccessors() == null || e.getVersion().getSuccessors().isEmpty(); for (final Property p : protoProperties) { + // if this is a replacement if (p.getStatementStatus() == StatementStatus.REPLACEMENT) { - replace(p, domainMap); + replace(p, domainMap, isHead); } for (final Property subP : p.getProperties()) { if (subP.getStatementStatus() == StatementStatus.REPLACEMENT) { - replace(subP, domainMap); + replace(subP, domainMap, isHead); } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntity.java index 2601367b..38cd7073 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntity.java @@ -102,12 +102,12 @@ public class RetrieveFullEntity extends BackendTransaction { execute(new RetrieveSparseEntity(e)); if (e.getEntityStatus() == EntityStatus.VALID) { + execute(new RetrieveVersionInfo(e)); if (e.getRole() == Role.QueryTemplate) { execute(new RetrieveQueryTemplateDefinition(e)); } execute(new RetrieveParents(e)); execute(new RetrieveProperties(e)); - execute(new RetrieveVersionInfo(e)); // recursion! retrieveSubEntities calls retrieveFull sometimes, but with reduced selectors. if (selections != null && !selections.isEmpty()) { diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java index 28f42308..8578191c 100644 --- a/src/main/java/org/caosdb/server/entity/Entity.java +++ b/src/main/java/org/caosdb/server/entity/Entity.java @@ -957,7 +957,8 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public String toString() { - return (hasId() ? "(" + getId().toString() + ")" : "()") + return (getRole().toString()) + + (hasId() ? "(" + getId().toString() + ")" : "()") + (hasCuid() ? "[" + getCuid() + "]" : "[]") + (hasName() ? "(" + getName() + ")" : "()") + (hasDatatype() ? "{" + getDatatype().toString() + "}" : "{}"); diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Property.java b/src/main/java/org/caosdb/server/entity/wrapper/Property.java index 305a9d83..b3ce45b5 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java @@ -120,7 +120,7 @@ public class Property extends EntityWrapper { @Override public String toString() { - return "IMPLPROPERTY " + this.entity.toString(); + return "IMPLPROPERTY (" + this.getStatementStatus() + ")" + this.entity.toString(); } public void setIsName(final boolean b) { -- GitLab