diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ListHandler.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ListHandler.java
index 92bdb7a18..372aff643 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ListHandler.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ListHandler.java
@@ -17,118 +17,44 @@
*/
package cz.cvut.kbss.ontodriver.rdf4j;
-import cz.cvut.kbss.ontodriver.descriptor.*;
+import cz.cvut.kbss.ontodriver.descriptor.ListDescriptor;
import cz.cvut.kbss.ontodriver.exception.IntegrityConstraintViolatedException;
-import cz.cvut.kbss.ontodriver.model.Axiom;
-import cz.cvut.kbss.ontodriver.model.NamedResource;
import cz.cvut.kbss.ontodriver.rdf4j.connector.Connector;
import cz.cvut.kbss.ontodriver.rdf4j.exception.Rdf4jDriverException;
import cz.cvut.kbss.ontodriver.rdf4j.util.Rdf4jUtils;
-import org.eclipse.rdf4j.model.*;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
/**
* Base class for list handlers.
*
* List handlers are responsible for loading and persisting lists.
- *
- * @param List descriptor type
- * @param List value descriptor type
*/
-abstract class ListHandler> {
+abstract class ListHandler {
- protected final Connector connector;
- protected final ValueFactory vf;
+ final Connector connector;
+ final ValueFactory vf;
ListHandler(Connector connector, ValueFactory vf) {
this.connector = connector;
this.vf = vf;
}
- /**
- * Loads axioms representing list described by the specified list descriptor.
- *
- * @return Collection of axioms representing sequence values
- * @throws Rdf4jDriverException When storage access error occurs
- */
- List> loadList(T listDescriptor) throws Rdf4jDriverException {
- final List> axioms = new ArrayList<>();
- final ListIterator> it = createIterator(listDescriptor);
- while (it.hasNext()) {
- axioms.add(it.nextAxiom());
- }
- return axioms;
- }
-
- abstract ListIterator> createIterator(T listDescriptor) throws Rdf4jDriverException;
-
- /**
- * Persists list values specified by the descriptor.
- *
- * The values are saved in the order in which they appear in the descriptor.
- *
- * @param listValueDescriptor Describes values to persist
- * @throws Rdf4jDriverException When storage access error occurs
- */
- void persistList(V listValueDescriptor) throws Rdf4jDriverException {
- if (listValueDescriptor.getValues().isEmpty()) {
- return;
- }
- final Collection statements = new ArrayList<>(listValueDescriptor.getValues().size());
- final IRI head = createListHead(listValueDescriptor, statements);
- statements.addAll(createListRest(head, listValueDescriptor));
- connector.addStatements(statements);
- }
-
- abstract IRI createListHead(V valueDescriptor, Collection listStatements) throws Rdf4jDriverException;
-
- abstract List createListRest(IRI head, V valueDescriptor) throws Rdf4jDriverException;
-
- /**
- * Updates list with values specified by the descriptor.
- *
- * @param listValueDescriptor Describes the updated values
- * @throws Rdf4jDriverException When storage access error occurs
- */
- void updateList(V listValueDescriptor) throws Rdf4jDriverException {
- if (listValueDescriptor.getValues().isEmpty()) {
- clearList(listValueDescriptor);
- } else if (isOldListEmpty(owner(listValueDescriptor), hasList(listValueDescriptor),
- listValueDescriptor.getListProperty().isInferred(), contexts(listValueDescriptor))) {
- persistList(listValueDescriptor);
- } else {
- mergeList(listValueDescriptor);
- }
- }
-
- private boolean isOldListEmpty(Resource owner, IRI hasListProperty, boolean includeInferred,
+ boolean isOldListEmpty(Resource owner, IRI hasListProperty, boolean includeInferred,
Set contexts) throws Rdf4jDriverException {
final Collection stmts = connector.findStatements(owner, hasListProperty, null,
includeInferred, contexts);
return stmts.isEmpty();
}
- abstract void clearList(V listDescriptor) throws Rdf4jDriverException;
-
- private void mergeList(V listDescriptor) throws Rdf4jDriverException {
- final ListIterator> it = iterator(listDescriptor);
- final MergeResult mergeResult = mergeWithOriginalList(listDescriptor, it);
- removeObsoletes(it);
- assert mergeResult.i > 0;
- assert mergeResult.previous != null;
- if (mergeResult.i < listDescriptor.getValues().size()) {
- appendNewNodes(listDescriptor, mergeResult);
- }
- }
-
- abstract ListIterator> iterator(V listDescriptor) throws Rdf4jDriverException;
-
- abstract MergeResult mergeWithOriginalList(V listDescriptor, ListIterator> it) throws Rdf4jDriverException;
-
- abstract void appendNewNodes(V listDescriptor, MergeResult mergeResult) throws Rdf4jDriverException;
-
- private void removeObsoletes(ListIterator> it) throws Rdf4jDriverException {
+ void removeObsoletes(ListIterator> it) throws Rdf4jDriverException {
while (it.hasNext()) {
it.nextNode();
it.remove();
@@ -174,35 +100,6 @@ IRI toRdf4jIri(java.net.URI uri) {
return Rdf4jUtils.toRdf4jIri(uri, vf);
}
- /**
- * Creates handler for simple lists.
- *
- * @param connector Storage connector
- * @param vf RDF4J value factory
- * @return List handler
- */
- static ListHandler createForSimpleList(
- Connector connector, ValueFactory vf) {
- assert connector != null;
- assert vf != null;
-
- return new SimpleListHandler(connector, vf);
- }
-
- /**
- * Creates handler for referenced lists.
- *
- * @param connector Storage connector
- * @param vf RDF4J value factory
- * @return List handler
- */
- static ListHandler> createForReferencedList(
- Connector connector, ValueFactory vf) {
- assert connector != null;
- assert vf != null;
-
- return new ReferencedListHandler(connector, vf);
- }
static final class MergeResult {
final int i;
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jAdapter.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jAdapter.java
index 0abff4ad1..c1f842bcf 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jAdapter.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jAdapter.java
@@ -19,11 +19,11 @@
import cz.cvut.kbss.ontodriver.Closeable;
import cz.cvut.kbss.ontodriver.Wrapper;
-import cz.cvut.kbss.ontodriver.descriptor.*;
+import cz.cvut.kbss.ontodriver.descriptor.AxiomDescriptor;
+import cz.cvut.kbss.ontodriver.descriptor.AxiomValueDescriptor;
import cz.cvut.kbss.ontodriver.exception.IdentifierGenerationException;
import cz.cvut.kbss.ontodriver.exception.OntoDriverException;
import cz.cvut.kbss.ontodriver.model.Axiom;
-import cz.cvut.kbss.ontodriver.model.NamedResource;
import cz.cvut.kbss.ontodriver.rdf4j.config.Constants;
import cz.cvut.kbss.ontodriver.rdf4j.config.RuntimeConfiguration;
import cz.cvut.kbss.ontodriver.rdf4j.connector.Connector;
@@ -39,7 +39,11 @@
import org.eclipse.rdf4j.model.vocabulary.RDF;
import java.net.URI;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
class Rdf4jAdapter implements Closeable, Wrapper {
@@ -210,15 +214,15 @@ StatementExecutor getQueryExecutor() {
return connector;
}
- ListHandler getSimpleListHandler() throws Rdf4jDriverException {
+ SimpleListHandler getSimpleListHandler() throws Rdf4jDriverException {
startTransactionIfNotActive();
- return ListHandler.createForSimpleList(connector, valueFactory);
+ return new SimpleListHandler(connector, valueFactory);
}
- ListHandler, ?> getReferencedListHandler() throws
+ ReferencedListHandler getReferencedListHandler() throws
Rdf4jDriverException {
startTransactionIfNotActive();
- return ListHandler.createForReferencedList(connector, valueFactory);
+ return new ReferencedListHandler(connector, valueFactory);
}
TypesHandler getTypesHandler() throws Rdf4jDriverException {
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jLists.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jLists.java
index 922a924d7..50778e194 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jLists.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/Rdf4jLists.java
@@ -84,7 +84,7 @@ public void persistReferencedList(ReferencedListValueDescriptor descripto
}
@Override
- public void updateReferencedList(ReferencedListValueDescriptor descriptor)
+ public void updateReferencedList(ReferencedListValueDescriptor descriptor)
throws OntoDriverException {
verifyArgs(descriptor);
adapter.getReferencedListHandler().updateList(descriptor);
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListHandler.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListHandler.java
index b3c3e08a2..38c1ac28b 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListHandler.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListHandler.java
@@ -20,6 +20,8 @@
import cz.cvut.kbss.ontodriver.descriptor.ReferencedListDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.ReferencedListValueDescriptor;
import cz.cvut.kbss.ontodriver.model.Assertion;
+import cz.cvut.kbss.ontodriver.model.Axiom;
+import cz.cvut.kbss.ontodriver.model.NamedResource;
import cz.cvut.kbss.ontodriver.rdf4j.connector.Connector;
import cz.cvut.kbss.ontodriver.rdf4j.exception.Rdf4jDriverException;
import cz.cvut.kbss.ontodriver.rdf4j.util.ValueConverter;
@@ -29,10 +31,14 @@
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
-public class ReferencedListHandler extends
- ListHandler, VT> {
+public class ReferencedListHandler extends ListHandler {
private int sequenceCounter = 0;
@@ -43,13 +49,40 @@ public class ReferencedListHandler extends
this.valueConverter = new ValueConverter(vf);
}
- @Override
- ListIterator createIterator(ReferencedListDescriptor listDescriptor) throws Rdf4jDriverException {
- return new ReferencedListIterator<>(listDescriptor, connector, vf);
+ /**
+ * Loads axioms representing list described by the specified list descriptor.
+ *
+ * @return Collection of axioms representing sequence values
+ * @throws Rdf4jDriverException When storage access error occurs
+ */
+ List> loadList(ReferencedListDescriptor listDescriptor) throws Rdf4jDriverException {
+ final List> axioms = new ArrayList<>();
+ final ListIterator> it = new ReferencedListIterator<>(listDescriptor, connector, vf);
+ while (it.hasNext()) {
+ axioms.add(it.nextAxiom());
+ }
+ return axioms;
+ }
+
+ /**
+ * Persists list values specified by the descriptor.
+ *
+ * The values are saved in the order in which they appear in the descriptor.
+ *
+ * @param listValueDescriptor Describes values to persist
+ * @throws Rdf4jDriverException When storage access error occurs
+ */
+ void persistList(ReferencedListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
+ if (listValueDescriptor.getValues().isEmpty()) {
+ return;
+ }
+ final Collection statements = new ArrayList<>(listValueDescriptor.getValues().size());
+ final IRI head = createListHead(listValueDescriptor, statements);
+ statements.addAll(createListRest(head, listValueDescriptor));
+ connector.addStatements(statements);
}
- @Override
- IRI createListHead(ReferencedListValueDescriptor listValueDescriptor,
+ IRI createListHead(ReferencedListValueDescriptor listValueDescriptor,
Collection statements) throws Rdf4jDriverException {
final IRI owner = owner(listValueDescriptor);
final IRI hasList = hasList(listValueDescriptor);
@@ -57,7 +90,7 @@ IRI createListHead(ReferencedListValueDescriptor listValueDescriptor,
final IRI context = context(listValueDescriptor);
final IRI nodeUri = generateSequenceNode(owner, context);
statements.add(vf.createStatement(owner, hasList, nodeUri, context));
- final Value nodeContent = toRdf4jValue(listValueDescriptor.getListProperty(), listValueDescriptor.getValues().get(0));
+ final Value nodeContent = toRdf4jValue(listValueDescriptor.getNodeContent(), listValueDescriptor.getValues().get(0));
statements.add(vf.createStatement(nodeUri, hasContent, nodeContent, context));
return nodeUri;
}
@@ -83,21 +116,19 @@ private IRI generateSequenceNode(IRI owner, IRI context) throws Rdf4jDriverExcep
return node;
}
- @Override
- List createListRest(IRI headNode, ReferencedListValueDescriptor listValueDescriptor)
+ List createListRest(IRI headNode, ReferencedListValueDescriptor listValueDescriptor)
throws Rdf4jDriverException {
final IRI owner = owner(listValueDescriptor);
final IRI hasNext = hasNext(listValueDescriptor);
final IRI hasContent = hasContent(listValueDescriptor);
final IRI context = context(listValueDescriptor);
IRI previous = headNode;
- final List statements = new ArrayList<>(
- listValueDescriptor.getValues().size() * 2);
+ final List statements = new ArrayList<>(listValueDescriptor.getValues().size() * 2);
final Iterator> it = listValueDescriptor.getValues().iterator();
// Skip the first element, it is already in the head
it.next();
while (it.hasNext()) {
- final Value content = toRdf4jValue(listValueDescriptor.getListProperty(), it.next());
+ final Value content = toRdf4jValue(listValueDescriptor.getNodeContent(), it.next());
previous = createListNode(owner, hasNext, hasContent, content, context, previous, statements);
}
return statements;
@@ -111,8 +142,24 @@ private IRI createListNode(IRI owner, IRI hasNext, IRI hasContent, Value content
return node;
}
- @Override
- void clearList(ReferencedListValueDescriptor listDescriptor) throws Rdf4jDriverException {
+ /**
+ * Updates list with values specified by the descriptor.
+ *
+ * @param listValueDescriptor Describes the updated values
+ * @throws Rdf4jDriverException When storage access error occurs
+ */
+ void updateList(ReferencedListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
+ if (listValueDescriptor.getValues().isEmpty()) {
+ clearList(listValueDescriptor);
+ } else if (isOldListEmpty(owner(listValueDescriptor), hasList(listValueDescriptor),
+ listValueDescriptor.getListProperty().isInferred(), contexts(listValueDescriptor))) {
+ persistList(listValueDescriptor);
+ } else {
+ mergeList(listValueDescriptor);
+ }
+ }
+
+ private void clearList(ReferencedListValueDescriptor listDescriptor) throws Rdf4jDriverException {
final IRI hasNext = hasNext(listDescriptor);
final IRI hasContent = hasContent(listDescriptor);
final boolean includeInferred = listDescriptor.getListProperty().isInferred();
@@ -134,13 +181,18 @@ void clearList(ReferencedListValueDescriptor listDescriptor) throws Rdf4jDri
connector.removeStatements(toRemove);
}
- @Override
- ListIterator iterator(ReferencedListValueDescriptor listDescriptor) throws Rdf4jDriverException {
- return new ReferencedListIterator<>(listDescriptor, connector, vf);
+ private void mergeList(ReferencedListValueDescriptor listDescriptor) throws Rdf4jDriverException {
+ final ListIterator it = new ReferencedListIterator<>(listDescriptor, connector, vf);
+ final ListHandler.MergeResult mergeResult = mergeWithOriginalList(listDescriptor, it);
+ removeObsoletes(it);
+ assert mergeResult.i > 0;
+ assert mergeResult.previous != null;
+ if (mergeResult.i < listDescriptor.getValues().size()) {
+ appendNewNodes(listDescriptor, mergeResult);
+ }
}
- @Override
- MergeResult mergeWithOriginalList(ReferencedListValueDescriptor listDescriptor, ListIterator it)
+ MergeResult mergeWithOriginalList(ReferencedListValueDescriptor listDescriptor, ListIterator it)
throws Rdf4jDriverException {
int i = 0;
Resource node = null;
@@ -149,15 +201,14 @@ MergeResult mergeWithOriginalList(ReferencedListValueDescriptor listDescript
final Object content = it.currentContent();
final Object newNode = listDescriptor.getValues().get(i);
if (!content.equals(newNode)) {
- it.replaceCurrentWith((VT) newNode);
+ it.replaceCurrentWith((V) newNode);
}
i++;
}
return new MergeResult(i, node);
}
- @Override
- void appendNewNodes(ReferencedListValueDescriptor listDescriptor, MergeResult mergeResult)
+ void appendNewNodes(ReferencedListValueDescriptor listDescriptor, MergeResult mergeResult)
throws Rdf4jDriverException {
int i = mergeResult.i;
Resource previous = mergeResult.previous;
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListIterator.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListIterator.java
index e8e1e72cb..f78a9c72c 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListIterator.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/ReferencedListIterator.java
@@ -97,7 +97,7 @@ private Statement getNodeContent(Resource node) throws Rdf4jDriverException {
@Override
public T currentContent() {
- return (T) ValueConverter.fromRdf4jValue(listDescriptor.getListProperty(), currentContent.getObject());
+ return (T) ValueConverter.fromRdf4jValue(listDescriptor.getListProperty(), currentContent.getObject()).orElse(null);
}
@Override
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/SimpleListHandler.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/SimpleListHandler.java
index d52ee3a11..55397b76d 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/SimpleListHandler.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/SimpleListHandler.java
@@ -19,6 +19,7 @@
import cz.cvut.kbss.ontodriver.descriptor.SimpleListDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.SimpleListValueDescriptor;
+import cz.cvut.kbss.ontodriver.model.Axiom;
import cz.cvut.kbss.ontodriver.model.NamedResource;
import cz.cvut.kbss.ontodriver.rdf4j.connector.Connector;
import cz.cvut.kbss.ontodriver.rdf4j.exception.Rdf4jDriverException;
@@ -27,20 +28,51 @@
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.ValueFactory;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
-class SimpleListHandler extends ListHandler {
+class SimpleListHandler extends ListHandler {
SimpleListHandler(Connector connector, ValueFactory vf) {
super(connector, vf);
}
- @Override
- ListIterator createIterator(SimpleListDescriptor listDescriptor) throws Rdf4jDriverException {
- return new SimpleListIterator(listDescriptor, connector, vf);
+ /**
+ * Loads axioms representing list described by the specified list descriptor.
+ *
+ * @return Collection of axioms representing sequence values
+ * @throws Rdf4jDriverException When storage access error occurs
+ */
+ List> loadList(SimpleListDescriptor listDescriptor) throws Rdf4jDriverException {
+ final List> axioms = new ArrayList<>();
+ final ListIterator> it = new SimpleListIterator(listDescriptor, connector, vf);
+ while (it.hasNext()) {
+ axioms.add(it.nextAxiom());
+ }
+ return axioms;
+ }
+
+ /**
+ * Persists list values specified by the descriptor.
+ *
+ * The values are saved in the order in which they appear in the descriptor.
+ *
+ * @param listValueDescriptor Describes values to persist
+ * @throws Rdf4jDriverException When storage access error occurs
+ */
+ void persistList(SimpleListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
+ if (listValueDescriptor.getValues().isEmpty()) {
+ return;
+ }
+ final Collection statements = new ArrayList<>(listValueDescriptor.getValues().size());
+ final IRI head = createListHead(listValueDescriptor, statements);
+ statements.addAll(createListRest(head, listValueDescriptor));
+ connector.addStatements(statements);
}
- @Override
IRI createListHead(SimpleListValueDescriptor listValueDescriptor, Collection listStatements) {
final IRI firstNode = toRdf4jIri(listValueDescriptor.getValues().get(0).getIdentifier());
listStatements.add(vf.createStatement(owner(listValueDescriptor), hasList(listValueDescriptor),
@@ -48,7 +80,6 @@ IRI createListHead(SimpleListValueDescriptor listValueDescriptor, Collection createListRest(IRI head, SimpleListValueDescriptor listValueDescriptor) {
final List statements = new ArrayList<>(listValueDescriptor.getValues().size());
IRI previous = head;
@@ -65,12 +96,27 @@ List createListRest(IRI head, SimpleListValueDescriptor listValueDesc
}
/**
- * We are using this code instead of iterator.remove for performance
- * reasons. The iterator has to reconnect the list for each removed node,
- * which takes a lot of time.
+ * Updates list with values specified by the descriptor.
+ *
+ * @param listValueDescriptor Describes the updated values
+ * @throws Rdf4jDriverException When storage access error occurs
*/
- @Override
- void clearList(SimpleListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
+ void updateList(SimpleListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
+ if (listValueDescriptor.getValues().isEmpty()) {
+ clearList(listValueDescriptor);
+ } else if (isOldListEmpty(owner(listValueDescriptor), hasList(listValueDescriptor),
+ listValueDescriptor.getListProperty().isInferred(), contexts(listValueDescriptor))) {
+ persistList(listValueDescriptor);
+ } else {
+ mergeList(listValueDescriptor);
+ }
+ }
+
+ /**
+ * We are using this code instead of iterator.remove for performance reasons. The iterator has to reconnect the list
+ * for each removed node, which takes a lot of time.
+ */
+ private void clearList(SimpleListValueDescriptor listValueDescriptor) throws Rdf4jDriverException {
final Set contexts = contexts(listValueDescriptor);
final Collection toRemove = new ArrayList<>();
IRI currentProperty = hasList(listValueDescriptor);
@@ -89,9 +135,19 @@ void clearList(SimpleListValueDescriptor listValueDescriptor) throws Rdf4jDriver
connector.removeStatements(toRemove);
}
- @Override
+ private void mergeList(SimpleListValueDescriptor listDescriptor) throws Rdf4jDriverException {
+ final ListIterator it = iterator(listDescriptor);
+ final ListHandler.MergeResult mergeResult = mergeWithOriginalList(listDescriptor, it);
+ removeObsoletes(it);
+ assert mergeResult.i > 0;
+ assert mergeResult.previous != null;
+ if (mergeResult.i < listDescriptor.getValues().size()) {
+ appendNewNodes(listDescriptor, mergeResult);
+ }
+ }
+
MergeResult mergeWithOriginalList(SimpleListValueDescriptor listDescriptor, ListIterator it) throws
- Rdf4jDriverException {
+ Rdf4jDriverException {
int i = 0;
Resource node = null;
while (it.hasNext() && i < listDescriptor.getValues().size()) {
@@ -106,9 +162,8 @@ MergeResult mergeWithOriginalList(SimpleListValueDescriptor listDescriptor, List
return new MergeResult(i, node);
}
- @Override
void appendNewNodes(SimpleListValueDescriptor listDescriptor, MergeResult mergeResult) throws
- Rdf4jDriverException {
+ Rdf4jDriverException {
int i = mergeResult.i;
final Collection toAdd = new ArrayList<>(listDescriptor.getValues().size() - i);
Resource previous = mergeResult.previous;
@@ -124,8 +179,7 @@ void appendNewNodes(SimpleListValueDescriptor listDescriptor, MergeResult mergeR
connector.addStatements(toAdd);
}
- @Override
- ListIterator iterator(SimpleListValueDescriptor listDescriptor) throws Rdf4jDriverException {
+ private ListIterator iterator(SimpleListValueDescriptor listDescriptor) throws Rdf4jDriverException {
return new SimpleListIterator(listDescriptor, connector, vf);
}
}
diff --git a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/util/ValueConverter.java b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/util/ValueConverter.java
index be3c85d23..6ebed2966 100644
--- a/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/util/ValueConverter.java
+++ b/ontodriver-rdf4j/src/main/java/cz/cvut/kbss/ontodriver/rdf4j/util/ValueConverter.java
@@ -57,7 +57,7 @@ public static Optional