Add TupleMap.reverse and TupleMap.sameMapping Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/05b9e3a0 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/05b9e3a0 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/05b9e3a0
Branch: refs/heads/master Commit: 05b9e3a0ce42747122986da9566ad6e5c30d97ee Parents: 684cfce Author: Andy Seaborne <[email protected]> Authored: Thu Dec 31 11:09:18 2015 +0000 Committer: Andy Seaborne <[email protected]> Committed: Thu Dec 31 11:09:18 2015 +0000 ---------------------------------------------------------------------- .../apache/jena/atlas/lib/tuple/TupleMap.java | 44 +++++++------- .../jena/atlas/lib/tuple/TestTupleMap.java | 60 +++++++++++++++----- 2 files changed, 71 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/05b9e3a0/jena-base/src/main/java/org/apache/jena/atlas/lib/tuple/TupleMap.java ---------------------------------------------------------------------- diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/tuple/TupleMap.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/tuple/TupleMap.java index f07b745..c8cad95 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/lib/tuple/TupleMap.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/tuple/TupleMap.java @@ -140,6 +140,23 @@ public class TupleMap { getTransform[x] = i; } } + + private TupleMap(String label, int[] getTransform, int[] putTransform) { + this.label = label ; + this.len = getTransform.length ; + this.getTransform = getTransform ; + this.putTransform = putTransform ; + } + + /** Return a {@code TupleMap} that maps in the opposite direction + * <pre> + * this.reverseMap().map is the same as this.unmap + * this.reverseMap().unmap is the same as this.map + * <pre> + */ + public TupleMap reverse() { + return new TupleMap("Reverse:"+label, putTransform, getTransform) ; + } /** Length of mapping */ public int length() { @@ -194,15 +211,6 @@ public class TupleMap { return apply(src, putTransform) ; } - // Does not work (java8) - assigning the return causes a runtime case exception - // /** Apply to an <em>unmapped</em> tuple to get a tuple with the tuple mapping applied */ - // public <T> T[] map(T[] src) { - // @SuppressWarnings("unchecked") - // T[]dst = (T[])new Object[src.length] ; - // applyArray(src, dst, getTransform) ; - // return dst ; - // } - /** Apply to an <em>unmapped</em> tuple to get a tuple with the tuple mapping applied. * Returns the destination array. */ @@ -213,15 +221,6 @@ public class TupleMap { return dst ; } - // Does not work (java8) - assigning the return causes a runtime case exception - // /** Apply to a <em>mapped</em> tuple to get a tuple with the tuple mapping reverse-applied */ - // public <T> T[] unmap(T[] src) { - // @SuppressWarnings("unchecked") - // T[]dst = (T[])new Object[src.length] ; - // applyArray(src, dst, putTransform) ; - // return dst ; - // } - /** Apply to a <em>mapped</em> tuple to get a tuple with the tuple mapping reverse-applied. * Returns the destination array. */ @@ -232,8 +231,7 @@ public class TupleMap { return dst ; } - /** Apply an index transformation - */ + /** Apply an index transformation */ private static <T> Tuple<T> apply(Tuple<T> src, int[] getTransform) { if ( src.len() != getTransform.length ) throw new IllegalArgumentException("Lengths do not match: Tuple:"+src.len()+"; transform:"+getTransform.length) ; @@ -370,6 +368,12 @@ public class TupleMap { return Collections.unmodifiableList(list) ; } + /** Is this mapping the same (has the same effect) as {@code other}? */ + public boolean sameMapping(TupleMap other) { + // Only need to check one array + return Arrays.equals(getTransform, other.getTransform) ; + } + @Override public String toString() { // return label ; http://git-wip-us.apache.org/repos/asf/jena/blob/05b9e3a0/jena-base/src/test/java/org/apache/jena/atlas/lib/tuple/TestTupleMap.java ---------------------------------------------------------------------- diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/tuple/TestTupleMap.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/tuple/TestTupleMap.java index 75e1a05..d10cce5 100644 --- a/jena-base/src/test/java/org/apache/jena/atlas/lib/tuple/TestTupleMap.java +++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/tuple/TestTupleMap.java @@ -18,8 +18,7 @@ package org.apache.jena.atlas.lib.tuple; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import java.util.Arrays ; import java.util.List ; @@ -33,7 +32,7 @@ public class TestTupleMap { // Check coverage @Test - public void map_tuple_01() { + public void map_tuple_1() { TupleMap tmap = TupleMap.create("SPO", "POS"); Tuple<String> tuple = TupleFactory.tuple("S", "P", "O"); Tuple<String> tuple2 = tmap.map(tuple); @@ -47,7 +46,7 @@ public class TestTupleMap { @Test - public void map_tuple_02() { + public void map_tuple_2() { TupleMap x = TupleMap.create("SPO", "POS"); Tuple<String> tuple = TupleFactory.tuple("S", "P", "O"); Tuple<String> mapped = x.map(tuple); @@ -56,7 +55,7 @@ public class TestTupleMap { } @Test - public void map_tuple_03() { + public void map_tuple_3() { TupleMap tmap = TupleMap.create("GSPO", "OSPG"); Tuple<String> tuple = TupleFactory.tuple("G", "S", "P", "O"); Tuple<String> mapped = tmap.map(tuple); @@ -67,7 +66,7 @@ public class TestTupleMap { } @Test - public void map_tuple_04() { + public void map_tuple_4() { String[] x = {"G", "S", "P", "O"}; String[] y = {"O", "S", "P", "G"}; @@ -82,7 +81,7 @@ public class TestTupleMap { } @Test - public void compile1() { + public void compile_1() { TupleMap map = TupleMap.create("SPO", "POS"); // SPO -> POS // col 0 goes to col 2 @@ -95,14 +94,14 @@ public class TestTupleMap { } @Test - public void compile2() { + public void compile_2() { TupleMap map = TupleMap.create("SPOG", "GOPS"); Integer[] expected = {3, 2, 1, 0}; assertEquals(Arrays.asList(expected), map.transformPut()); } @Test - public void map_slot_01() { + public void map_slot_1() { TupleMap tmap = TupleMap.create("SPO", "POS"); Tuple<String> tuple = TupleFactory.tuple("S", "P", "O"); assertEquals("P", tmap.mapSlot(0, tuple)); @@ -116,7 +115,7 @@ public class TestTupleMap { } @Test - public void map_slot_02() { + public void map_slot_2() { TupleMap tmap = TupleMap.create("SPO", "POS"); Tuple<String> tuple = TupleFactory.tuple("S", "P", "O"); Tuple<String> tuple1 = TupleFactory.tuple @@ -128,7 +127,7 @@ public class TestTupleMap { } @Test - public void map_slot_03() { + public void map_slot_3() { TupleMap tmap = TupleMap.create("POS", "SPO"); Tuple<String> tuple = TupleFactory.tuple("P", "O", "S"); Tuple<String> tuple1 = TupleFactory.tuple @@ -153,7 +152,7 @@ public class TestTupleMap { } @Test - public void map_array_01() { + public void map_array_1() { TupleMap x = TupleMap.create("SPO","POS"); Tuple<Integer> t = TupleFactory.tuple(2, 0, 1); Tuple<Integer> t1 = x.map(t); @@ -174,7 +173,7 @@ public class TestTupleMap { } @Test - public void map_array_02() { + public void map_array_2() { // (0,1,2) -> (2,0,1) S->2 etc // so (0,1,2) <- (1,2,0) TupleMap x = TupleMap.create("SPO","POS"); @@ -183,4 +182,39 @@ public class TestTupleMap { assertEquals("Y", x.unmapSlot(1, array)); assertEquals("Z", x.unmapSlot(2, array)); } + + @Test + public void map_same_1() { + TupleMap x1 = TupleMap.create("SPO","POS"); + TupleMap x2 = TupleMap.create("SPO","POS"); + assertTrue(x1.sameMapping(x1)) ; + assertTrue(x1.sameMapping(x2)) ; + assertTrue(x2.sameMapping(x1)) ; + } + + @Test + public void map_same_2() { + TupleMap x1 = TupleMap.create("SPO","POS"); + TupleMap x2 = TupleMap.create("SPO","OSP"); + assertFalse(x1.sameMapping(x2)) ; + assertFalse(x2.sameMapping(x1)) ; + } + + @Test + public void map_reverse_1() { + TupleMap x1 = TupleMap.create("SPO","POS"); + TupleMap x2 = TupleMap.create("POS","SPO"); + assertTrue(x1.reverse().sameMapping(x2)) ; + assertFalse(x1.reverse().sameMapping(x1)) ; + } + + @Test + public void map_reverse_2() { + TupleMap x1 = TupleMap.create("SPO","POS"); + TupleMap x2 = TupleMap.create("POS","SPO"); + Tuple<String> tuple = TupleFactory.tuple("X", "Y", "Z") ; + Tuple<String> tuple1 = x1.map(tuple) ; + Tuple<String> tuple2 = x2.unmap(tuple) ; + assertEquals(tuple1, tuple2) ; + } }
