You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/02/13 18:39:05 UTC

jena git commit: JENA-1141: Add the function BunchMap.getOrSet.

Repository: jena
Updated Branches:
  refs/heads/master 9b38d8e91 -> 0279a0dad


JENA-1141: Add the function BunchMap.getOrSet.

Not used - testing shows no observable difference in performance.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/0279a0da
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/0279a0da
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/0279a0da

Branch: refs/heads/master
Commit: 0279a0dad94c81c0d4c333f35f2ed9c8f1ad3467
Parents: 9b38d8e
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Feb 13 17:38:34 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Feb 13 17:38:34 2016 +0000

----------------------------------------------------------------------
 .../main/java/org/apache/jena/mem/BunchMap.java |  8 +++++
 .../org/apache/jena/mem/HashedBunchMap.java     | 31 +++++++++++++++-----
 .../org/apache/jena/mem/NodeToTriplesMap.java   |  4 +++
 .../apache/jena/mem/NodeToTriplesMapMem.java    |  4 +++
 .../org/apache/jena/mem/WrappedHashMap.java     |  8 +++++
 5 files changed, 48 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/0279a0da/jena-core/src/main/java/org/apache/jena/mem/BunchMap.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/mem/BunchMap.java b/jena-core/src/main/java/org/apache/jena/mem/BunchMap.java
index 52b6a66..f184be8 100644
--- a/jena-core/src/main/java/org/apache/jena/mem/BunchMap.java
+++ b/jena-core/src/main/java/org/apache/jena/mem/BunchMap.java
@@ -18,6 +18,8 @@
 
 package org.apache.jena.mem;
 
+import java.util.function.Function ;
+
 import org.apache.jena.util.iterator.ExtendedIterator ;
 
 /**
@@ -49,6 +51,12 @@ public interface BunchMap
         will now deliver this value.
     */
     public void put( Object key, TripleBunch value );
+    
+    /**
+      Get the <code>key</code> and return the value found there; if nothing,
+      cacluate the <code>value</code> and insert. Return the value now the slot.  
+     */
+    public TripleBunch getOrSet( Object key, Function<Object, TripleBunch> setter );
 
     /**
         Remove any association for <code>key</code>; <code>get</code> on this

http://git-wip-us.apache.org/repos/asf/jena/blob/0279a0da/jena-core/src/main/java/org/apache/jena/mem/HashedBunchMap.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/mem/HashedBunchMap.java b/jena-core/src/main/java/org/apache/jena/mem/HashedBunchMap.java
index 9ec0de8..02fb56e 100644
--- a/jena-core/src/main/java/org/apache/jena/mem/HashedBunchMap.java
+++ b/jena-core/src/main/java/org/apache/jena/mem/HashedBunchMap.java
@@ -18,7 +18,9 @@
 
 package org.apache.jena.mem;
 
-import org.apache.jena.shared.* ;
+import java.util.function.Function ;
+
+import org.apache.jena.shared.BrokenException ;
 
 /**
     An implementation of BunchMap that does open-addressed hashing.
@@ -65,14 +67,29 @@ public class HashedBunchMap extends HashCommon<Object> implements BunchMap
         if (slot < 0)
             values[~slot] = value;
         else
-            {
-            keys[slot] = key;
-            values[slot] = value; 
-            size += 1;
-            if (size == threshold) grow();
-            }
+            put$(slot, key, value) ;
         }
 
+    @Override
+    public TripleBunch getOrSet( Object key, Function<Object, TripleBunch> setter) {
+        int slot = findSlot( key );
+        if (slot < 0)
+            // Get.
+            return values[~slot] ;
+        // Or set value.
+        TripleBunch value = setter.apply(key) ;
+        put$(slot, key, value) ;
+        return value ;
+        }
+    
+    private void put$(int slot, Object key, TripleBunch value) {
+        keys[slot] = key;
+        values[slot] = value;
+        size += 1;
+        if ( size == threshold )
+            grow();
+    }
+    
     protected void grow()
         {
         Object [] oldContents = keys;

http://git-wip-us.apache.org/repos/asf/jena/blob/0279a0da/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMap.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMap.java b/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMap.java
index 3342241..a41f748 100644
--- a/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMap.java
+++ b/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMap.java
@@ -39,6 +39,10 @@ public class NodeToTriplesMap extends NodeToTriplesMapBase
     @Override public boolean add( Triple t ) 
         {
         Object o = getIndexField( t );
+        
+        // Feb 2016 : no measurable difference.
+        //OpenSetBunch s = (OpenSetBunch) bunchMap.getOrSet(o, (k)->createSetBunch()) ;
+        
         OpenSetBunch s = (OpenSetBunch) bunchMap.get( o );
         if (s == null) bunchMap.put( o, s = createSetBunch() );
         if (s.baseSet().add( t )) { size += 1; return true; } else return false; 

http://git-wip-us.apache.org/repos/asf/jena/blob/0279a0da/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMapMem.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMapMem.java b/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMapMem.java
index 107cf3b..bac0833 100644
--- a/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMapMem.java
+++ b/jena-core/src/main/java/org/apache/jena/mem/NodeToTriplesMapMem.java
@@ -43,6 +43,10 @@ public class NodeToTriplesMapMem extends NodeToTriplesMapBase
     @Override public boolean add( Triple t ) 
        {
        Object o = getIndexField( t );
+
+       // Feb 2016 : no measurable difference.
+       //TripleBunch s = bunchMap.getOrSet(o, (k)->new ArrayBunch()) ;
+       
        TripleBunch s = bunchMap.get( o );
        if (s == null) bunchMap.put( o, s = new ArrayBunch() );
        if (s.contains( t ))

http://git-wip-us.apache.org/repos/asf/jena/blob/0279a0da/jena-core/src/main/java/org/apache/jena/mem/WrappedHashMap.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/mem/WrappedHashMap.java b/jena-core/src/main/java/org/apache/jena/mem/WrappedHashMap.java
index b4a2d02..b5c929e 100644
--- a/jena-core/src/main/java/org/apache/jena/mem/WrappedHashMap.java
+++ b/jena-core/src/main/java/org/apache/jena/mem/WrappedHashMap.java
@@ -19,6 +19,7 @@
 package org.apache.jena.mem;
 
 import java.util.Map;
+import java.util.function.Function ;
 
 import org.apache.jena.util.CollectionFactory ;
 import org.apache.jena.util.iterator.* ;
@@ -30,6 +31,8 @@ public class WrappedHashMap implements BunchMap
     {
     protected final Map<Object, TripleBunch> map = CollectionFactory.createHashedMap();
     
+    public WrappedHashMap() {}
+    
     @Override
     public void clear()
         { map.clear(); }
@@ -47,6 +50,11 @@ public class WrappedHashMap implements BunchMap
         { map.put( key, value ); }
 
     @Override
+    public TripleBunch getOrSet( Object key, Function<Object, TripleBunch> setter) {
+        return map.computeIfAbsent(key, setter);
+    }
+
+    @Override
     public void remove( Object key )
         { map.remove( key ); }