Skip to content

Commit

Permalink
#1441 switched to LinkedHashModel and also fixed size for LinkedHashM…
Browse files Browse the repository at this point in the history
…odel

Signed-off-by: Håvard Ottestad <hmottestad@gmail.com>
  • Loading branch information
hmottestad committed Jul 14, 2019
1 parent 53c2814 commit caef764
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@
*******************************************************************************/
package org.eclipse.rdf4j.model.impl;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.Namespace;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.util.PatternIterator;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
Expand All @@ -20,14 +28,6 @@
import java.util.Optional;
import java.util.Set;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.Namespace;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.util.PatternIterator;

/**
* Hash table based implementation of the <tt>{@link Model}</tt> interface.
* <p>
Expand All @@ -43,11 +43,11 @@
* unsynchronized access to the LinkedHashModel instance (though the synchronization guarantee is only when accessing
* via the Set interface methods):
* </p>
*
*
* <pre>
* Set<Statement> s = Collections.synchronizedSet(new LinkedHashModel(...));
* </pre>
*
*
* @author James Leigh
*/
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -79,8 +79,12 @@ public LinkedHashModel(Collection<? extends Statement> c) {

public LinkedHashModel(int size) {
super();
values = new HashMap<>(size * 2);
statements = new LinkedHashSet<>(size);

// assume fewer unique values than statements (eg. some reuse of nodes instatements)
values = new HashMap<>(size, 0.75f);

// compensate for the loadfactor by multiplying by 2
statements = new LinkedHashSet<>(size * 2, 0.75f);
}

public LinkedHashModel(Set<Namespace> namespaces, Collection<? extends Statement> c) {
Expand Down Expand Up @@ -143,8 +147,9 @@ public int size() {

@Override
public boolean add(Resource subj, IRI pred, Value obj, Resource... contexts) {
if (subj == null || pred == null || obj == null)
if (subj == null || pred == null || obj == null) {
throw new UnsupportedOperationException("Incomplete statement");
}
Value[] ctxs = notNull(contexts);
if (ctxs.length == 0) {
ctxs = NULL_CTX;
Expand Down Expand Up @@ -391,12 +396,15 @@ public Resource getContext() {

@Override
public boolean equals(Object other) {
if (this == other)
if (this == other) {
return true;
if (!super.equals(other))
}
if (!super.equals(other)) {
return false;
if (getContext() == null)
}
if (getContext() == null) {
return ((Statement) other).getContext() == null;
}
return getContext().equals(((Statement) other).getContext());
}
}
Expand Down Expand Up @@ -444,23 +452,27 @@ private Set<ModelStatement> choose(Resource subj, IRI pred, Value obj, Resource.
Set<ModelStatement> p = null;
Set<ModelStatement> o = null;
if (subj != null) {
if (!values.containsKey(subj))
if (!values.containsKey(subj)) {
return Collections.emptySet();
}
s = values.get(subj).subjects;
}
if (pred != null) {
if (!values.containsKey(pred))
if (!values.containsKey(pred)) {
return Collections.emptySet();
}
p = values.get(pred).predicates;
}
if (obj != null) {
if (!values.containsKey(obj))
if (!values.containsKey(obj)) {
return Collections.emptySet();
}
o = values.get(obj).objects;
}
if (contexts.length == 1) {
if (!values.containsKey(contexts[0]))
if (!values.containsKey(contexts[0])) {
return Collections.emptySet();
}
Set<ModelStatement> c = values.get(contexts[0]).contexts;
return smallest(statements, s, p, o, c);
} else {
Expand Down Expand Up @@ -513,8 +525,9 @@ private Set<ModelStatement> smallest(Set<ModelStatement>... sets) {

private <V extends Value> ModelNode<V> asNode(V value) {
ModelNode node = values.get(value);
if (node != null)
if (node != null) {
return node;
}
node = new ModelNode<>(value);
values.put(value, node);
return node;
Expand Down
16 changes: 12 additions & 4 deletions model/src/main/java/org/eclipse/rdf4j/model/util/Models.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.URI;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.impl.TreeModel;
import org.eclipse.rdf4j.model.impl.LinkedHashModel;

import java.util.ArrayDeque;
import java.util.ArrayList;
Expand Down Expand Up @@ -782,7 +782,7 @@ private static boolean statementsMatch(Statement st1, Statement st2, Map<Resourc
private static boolean isBlank(Value value) {
if (value instanceof IRI) {
boolean skolemizedBNode = value.stringValue().contains("/.well-known/genid/"); // this handles isomorphic on
// skolemized ID
// skolemized ID
return skolemizedBNode;
} else {
return value instanceof BNode;
Expand All @@ -793,8 +793,16 @@ private static Model toModel(Iterable<? extends Statement> iterable) {
if (iterable instanceof Model) {
return (Model) iterable;
}
final Model set = new TreeModel();
StreamSupport.stream(iterable.spliterator(), false).filter(Objects::nonNull).forEach(st -> set.add(st));

final Model set;
if (iterable instanceof List) {
int size = ((List<? extends Statement>) iterable).size();
set = new LinkedHashModel(size);
} else {
set = new LinkedHashModel();
}

StreamSupport.stream(iterable.spliterator(), false).filter(Objects::nonNull).forEach(set::add);
return set;
}

Expand Down

0 comments on commit caef764

Please sign in to comment.