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