You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2013/09/03 15:34:28 UTC
git commit: fix wrong handling of .equals() and .hashCode() for
KiWiTriples (see https://openrdf.atlassian.net/browse/SES-1924>);
this change is potentially breaking some code, please check
Updated Branches:
refs/heads/develop a1fb498e5 -> c48c85995
fix wrong handling of .equals() and .hashCode() for KiWiTriples (see https://openrdf.atlassian.net/browse/SES-1924>); this change is potentially breaking some code, please check
Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/c48c8599
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/c48c8599
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/c48c8599
Branch: refs/heads/develop
Commit: c48c859957b37111c1b15f038b6ba85576eeeaf9
Parents: a1fb498
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Tue Sep 3 15:34:29 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Tue Sep 3 15:34:29 2013 +0200
----------------------------------------------------------------------
.../marmotta/kiwi/model/rdf/KiWiTriple.java | 12 +---
.../sesame/repository/KiWiRepositoryTest.java | 69 ++++++++++++++++++
.../kiwi/model/caching/TripleTable.java | 75 +++++++++++++++-----
3 files changed, 130 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c48c8599/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiTriple.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiTriple.java b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiTriple.java
index 4af2e42..db9deea 100644
--- a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiTriple.java
+++ b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/model/rdf/KiWiTriple.java
@@ -259,12 +259,10 @@ public class KiWiTriple implements Statement, Serializable {
@Override
public boolean equals(Object o) {
if (this == o) return true;
-// if (!(o instanceof KiWiTriple)) return false;
-
Statement triple = (Statement) o;
-
- if (!getContext().equals(triple.getContext())) return false;
+// changed according to https://openrdf.atlassian.net/browse/SES-1924
+// if (!getContext().equals(triple.getContext())) return false;
if (!getObject().equals(triple.getObject())) return false;
if (!getPredicate().equals(triple.getPredicate())) return false;
return getSubject().equals(triple.getSubject());
@@ -273,11 +271,7 @@ public class KiWiTriple implements Statement, Serializable {
@Override
public int hashCode() {
- int result = getSubject().hashCode();
- result = 31 * result + getPredicate().hashCode();
- result = 31 * result + getObject().hashCode();
- result = 31 * result + getContext().hashCode();
- return result;
+ return 961 * getSubject().hashCode() + 31 * getPredicate().hashCode() + getObject().hashCode();
}
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c48c8599/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/sesame/repository/KiWiRepositoryTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/sesame/repository/KiWiRepositoryTest.java b/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/sesame/repository/KiWiRepositoryTest.java
new file mode 100644
index 0000000..b466474
--- /dev/null
+++ b/libraries/kiwi/kiwi-triplestore/src/test/java/org/apache/marmotta/kiwi/test/sesame/repository/KiWiRepositoryTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.marmotta.kiwi.test.sesame.repository;
+
+import org.apache.marmotta.kiwi.config.KiWiConfiguration;
+import org.apache.marmotta.kiwi.sail.KiWiStore;
+import org.apache.marmotta.kiwi.test.junit.KiWiDatabaseRunner;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryTest;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailException;
+import org.openrdf.sail.helpers.SailWrapper;
+
+import java.sql.SQLException;
+
+import static org.junit.Assert.fail;
+
+/**
+ * Run the {@link RepositoryTest}s.
+ * @author Jakob Frank <ja...@apache.org>
+ *
+ */
+@RunWith(KiWiDatabaseRunner.class)
+public class KiWiRepositoryTest extends RepositoryTest {
+
+ private final KiWiConfiguration config;
+
+ public KiWiRepositoryTest(KiWiConfiguration config) {
+ this.config = config;
+ }
+
+ /* (non-Javadoc)
+ * @see org.openrdf.repository.RepositoryTest#createRepository()
+ */
+ @Override
+ protected Repository createRepository() throws Exception {
+ Sail store = new SailWrapper(new KiWiStore(config)) {
+ @Override
+ public void shutDown() throws SailException {
+ try {
+ ((KiWiStore)getBaseSail()).getPersistence().dropDatabase();
+ } catch (SQLException e) {
+ fail("SQL exception while deleting database");
+ }
+
+ super.shutDown();
+ }
+ };
+ return new SailRepository(store);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c48c8599/libraries/kiwi/kiwi-tripletable/src/main/java/org/apache/marmotta/kiwi/model/caching/TripleTable.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-tripletable/src/main/java/org/apache/marmotta/kiwi/model/caching/TripleTable.java b/libraries/kiwi/kiwi-tripletable/src/main/java/org/apache/marmotta/kiwi/model/caching/TripleTable.java
index f4b986e..0d9736b 100644
--- a/libraries/kiwi/kiwi-tripletable/src/main/java/org/apache/marmotta/kiwi/model/caching/TripleTable.java
+++ b/libraries/kiwi/kiwi-tripletable/src/main/java/org/apache/marmotta/kiwi/model/caching/TripleTable.java
@@ -17,22 +17,18 @@
*/
package org.apache.marmotta.kiwi.model.caching;
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
import com.google.common.base.Predicate;
-import com.google.common.collect.Sets;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterators;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NavigableMap;
-import java.util.Set;
-import java.util.TreeMap;
+import java.util.*;
/**
* A triple table that allows efficient in-memory operations over large collections of triples. This can be used as
@@ -44,7 +40,7 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
private static final long serialVersionUID = 1L;
- private Set<Triple> data;
+ private Set<StatementWrapper> data;
/**
* A set that orders triples orderd in a way that the subject is the most significant, while the context is the
@@ -61,14 +57,14 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
private NavigableMap<IntArray,Triple> indexCSPO;
public TripleTable() {
- data = new HashSet<Triple>();
+ data = new HashSet<StatementWrapper>();
indexSPOC = new TreeMap<IntArray, Triple>();
indexCSPO = new TreeMap<IntArray, Triple>();
}
public TripleTable(Collection<Triple> triples) {
- data = new HashSet<Triple>(triples.size());
+ data = new HashSet<StatementWrapper>(triples.size());
indexSPOC = new TreeMap<IntArray, Triple>();
indexCSPO = new TreeMap<IntArray, Triple>();
addAll(triples);
@@ -124,7 +120,7 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
*/
@Override
public Iterator<Triple> iterator() {
- return data.iterator();
+ return Iterators.transform(data.iterator(), new UnwrapperFunction());
}
/**
@@ -229,7 +225,7 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
public synchronized boolean add(Triple triple) {
indexSPOC.put(IntArray.createSPOCKey(triple.getSubject(), triple.getPredicate(), triple.getObject(), triple.getContext()),triple);
indexCSPO.put(IntArray.createCSPOKey(triple.getSubject(), triple.getPredicate(), triple.getObject(), triple.getContext()),triple);
- return data.add(triple);
+ return data.add(new StatementWrapper(triple));
}
/**
@@ -446,14 +442,14 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
}
};
- return Sets.filter(data, p);
+ return Collections2.filter(Collections2.transform(data, new UnwrapperFunction()), p);
}
}
public synchronized Collection<Resource> listContextIDs() {
Set<Resource> result = new HashSet<>();
- for(Statement stmt : data) {
- result.add(stmt.getContext());
+ for(StatementWrapper stmt : data) {
+ result.add(stmt.delegate.getContext());
}
return result;
}
@@ -475,4 +471,49 @@ public class TripleTable<Triple extends Statement> implements Set<Triple>, Seria
public synchronized int hashCode() {
return data.hashCode();
}
+
+
+ private class StatementWrapper {
+ Triple delegate;
+
+ private StatementWrapper(Triple delegate) {
+ this.delegate = delegate;
+ }
+
+ private Triple getDelegate() {
+ return delegate;
+ }
+
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(delegate,delegate.getContext());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+
+ Statement triple = ((StatementWrapper)o).delegate;
+ if (!Objects.equal(delegate.getContext(), triple.getContext())) return false;
+ if (!Objects.equal(delegate.getObject(),triple.getObject())) return false;
+ if (!Objects.equal(delegate.getPredicate(),triple.getPredicate())) return false;
+ return Objects.equal(delegate.getSubject(),triple.getSubject());
+ }
+ }
+
+
+ private class WrapperFunction implements Function<Triple, StatementWrapper> {
+ @Override
+ public StatementWrapper apply(Triple input) {
+ return new StatementWrapper(input);
+ }
+ }
+
+ private class UnwrapperFunction implements Function<StatementWrapper, Triple> {
+ @Override
+ public Triple apply(StatementWrapper input) {
+ return input.delegate;
+ }
+ }
}