From a4d49a380da3eaa8eda286cb4920b611d5827feb Mon Sep 17 00:00:00 2001 From: Mathieu Bastian Date: Mon, 1 May 2023 21:22:35 +0200 Subject: [PATCH 1/3] Add copy constructors to interval and timestamp map/set --- .../graph/api/types/IntervalBooleanMap.java | 9 ++++++ .../graph/api/types/IntervalByteMap.java | 9 ++++++ .../graph/api/types/IntervalCharMap.java | 9 ++++++ .../graph/api/types/IntervalDoubleMap.java | 9 ++++++ .../graph/api/types/IntervalFloatMap.java | 9 ++++++ .../graph/api/types/IntervalIntegerMap.java | 9 ++++++ .../graph/api/types/IntervalLongMap.java | 9 ++++++ .../gephi/graph/api/types/IntervalSet.java | 9 ++++++ .../graph/api/types/IntervalShortMap.java | 9 ++++++ .../graph/api/types/IntervalStringMap.java | 9 ++++++ .../graph/api/types/TimestampBooleanMap.java | 9 ++++++ .../graph/api/types/TimestampByteMap.java | 9 ++++++ .../graph/api/types/TimestampCharMap.java | 9 ++++++ .../graph/api/types/TimestampDoubleMap.java | 9 ++++++ .../graph/api/types/TimestampFloatMap.java | 9 ++++++ .../graph/api/types/TimestampIntegerMap.java | 9 ++++++ .../graph/api/types/TimestampLongMap.java | 9 ++++++ .../gephi/graph/api/types/TimestampSet.java | 9 ++++++ .../graph/api/types/TimestampShortMap.java | 9 ++++++ .../graph/api/types/TimestampStringMap.java | 9 ++++++ .../graph/api/types/IntervalMapTest.java | 29 +++++++++++++++++++ .../graph/api/types/IntervalSetTest.java | 10 +++++++ .../graph/api/types/TimestampMapTest.java | 29 +++++++++++++++++++ .../graph/api/types/TimestampSetTest.java | 9 ++++++ 24 files changed, 257 insertions(+) diff --git a/src/main/java/org/gephi/graph/api/types/IntervalBooleanMap.java b/src/main/java/org/gephi/graph/api/types/IntervalBooleanMap.java index 0d9898c2..7d4980c2 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalBooleanMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalBooleanMap.java @@ -63,6 +63,15 @@ public IntervalBooleanMap(double[] keys, boolean[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalBooleanMap(IntervalBooleanMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalByteMap.java b/src/main/java/org/gephi/graph/api/types/IntervalByteMap.java index 9601e71e..3e922144 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalByteMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalByteMap.java @@ -63,6 +63,15 @@ public IntervalByteMap(double[] keys, byte[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalByteMap(IntervalByteMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalCharMap.java b/src/main/java/org/gephi/graph/api/types/IntervalCharMap.java index 054579d3..5878cc40 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalCharMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalCharMap.java @@ -63,6 +63,15 @@ public IntervalCharMap(double[] keys, char[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalCharMap(IntervalCharMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalDoubleMap.java b/src/main/java/org/gephi/graph/api/types/IntervalDoubleMap.java index fe209193..045a9893 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalDoubleMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalDoubleMap.java @@ -63,6 +63,15 @@ public IntervalDoubleMap(double[] keys, double[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalDoubleMap(IntervalDoubleMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalFloatMap.java b/src/main/java/org/gephi/graph/api/types/IntervalFloatMap.java index 8075bfe7..4f24a9c1 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalFloatMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalFloatMap.java @@ -64,6 +64,15 @@ public IntervalFloatMap(double[] keys, float[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalFloatMap(IntervalFloatMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalIntegerMap.java b/src/main/java/org/gephi/graph/api/types/IntervalIntegerMap.java index 42f717e6..afe912be 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalIntegerMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalIntegerMap.java @@ -63,6 +63,15 @@ public IntervalIntegerMap(double[] keys, int[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalIntegerMap(IntervalIntegerMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalLongMap.java b/src/main/java/org/gephi/graph/api/types/IntervalLongMap.java index d25779da..33203e1e 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalLongMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalLongMap.java @@ -63,6 +63,15 @@ public IntervalLongMap(double[] keys, long[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalLongMap(IntervalLongMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalSet.java b/src/main/java/org/gephi/graph/api/types/IntervalSet.java index 70ac6285..b498d8ee 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalSet.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalSet.java @@ -65,6 +65,15 @@ public IntervalSet(double[] arr) { size = arr.length / 2; } + /** + * Copy constructor. + * + * @param source set to copy + */ + public IntervalSet(IntervalSet source) { + this(source.array); + } + @Override public boolean add(Interval interval) { return addInner(interval.getLow(), interval.getHigh()) >= 0; diff --git a/src/main/java/org/gephi/graph/api/types/IntervalShortMap.java b/src/main/java/org/gephi/graph/api/types/IntervalShortMap.java index ce6eedcf..31ceb8c7 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalShortMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalShortMap.java @@ -63,6 +63,15 @@ public IntervalShortMap(double[] keys, short[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalShortMap(IntervalShortMap source) { + this(source.array, source.values); + } + /** * Get the value for the given interval. * diff --git a/src/main/java/org/gephi/graph/api/types/IntervalStringMap.java b/src/main/java/org/gephi/graph/api/types/IntervalStringMap.java index 968833f3..8b49bd30 100644 --- a/src/main/java/org/gephi/graph/api/types/IntervalStringMap.java +++ b/src/main/java/org/gephi/graph/api/types/IntervalStringMap.java @@ -62,6 +62,15 @@ public IntervalStringMap(double[] keys, String[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public IntervalStringMap(IntervalStringMap source) { + this(source.array, source.values); + } + @Override public Class getTypeClass() { return String.class; diff --git a/src/main/java/org/gephi/graph/api/types/TimestampBooleanMap.java b/src/main/java/org/gephi/graph/api/types/TimestampBooleanMap.java index 38621d01..9b7a73e5 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampBooleanMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampBooleanMap.java @@ -63,6 +63,15 @@ public TimestampBooleanMap(double[] keys, boolean[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampBooleanMap(TimestampBooleanMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampByteMap.java b/src/main/java/org/gephi/graph/api/types/TimestampByteMap.java index 76f95176..d5afaa18 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampByteMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampByteMap.java @@ -62,6 +62,15 @@ public TimestampByteMap(double[] keys, byte[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampByteMap(TimestampByteMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampCharMap.java b/src/main/java/org/gephi/graph/api/types/TimestampCharMap.java index 355e84a4..2e368062 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampCharMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampCharMap.java @@ -63,6 +63,15 @@ public TimestampCharMap(double[] keys, char[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampCharMap(TimestampCharMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampDoubleMap.java b/src/main/java/org/gephi/graph/api/types/TimestampDoubleMap.java index eebf197a..8c10ad0b 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampDoubleMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampDoubleMap.java @@ -61,6 +61,15 @@ public TimestampDoubleMap(double[] keys, double[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampDoubleMap(TimestampDoubleMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp index. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampFloatMap.java b/src/main/java/org/gephi/graph/api/types/TimestampFloatMap.java index 18ab8886..ef0f613e 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampFloatMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampFloatMap.java @@ -63,6 +63,15 @@ public TimestampFloatMap(double[] keys, float[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampFloatMap(TimestampFloatMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampIntegerMap.java b/src/main/java/org/gephi/graph/api/types/TimestampIntegerMap.java index 7fb42030..b12a9dc1 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampIntegerMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampIntegerMap.java @@ -63,6 +63,15 @@ public TimestampIntegerMap(double[] keys, int[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampIntegerMap(TimestampIntegerMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampLongMap.java b/src/main/java/org/gephi/graph/api/types/TimestampLongMap.java index db37c662..665c6c37 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampLongMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampLongMap.java @@ -63,6 +63,15 @@ public TimestampLongMap(double[] keys, long[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampLongMap(TimestampLongMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampSet.java b/src/main/java/org/gephi/graph/api/types/TimestampSet.java index 2eb485e1..dfc1d707 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampSet.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampSet.java @@ -64,6 +64,15 @@ public TimestampSet(double[] arr) { size = arr.length; } + /** + * Copy constructor. + * + * @param source the set to copy + */ + public TimestampSet(TimestampSet source) { + this(source.array); + } + @Override public boolean add(Double timestamp) { return addInner(timestamp) >= 0; diff --git a/src/main/java/org/gephi/graph/api/types/TimestampShortMap.java b/src/main/java/org/gephi/graph/api/types/TimestampShortMap.java index d2881844..0b807c8f 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampShortMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampShortMap.java @@ -63,6 +63,15 @@ public TimestampShortMap(double[] keys, short[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampShortMap(TimestampShortMap source) { + this(source.array, source.values); + } + /** * Get the value for the given timestamp. * diff --git a/src/main/java/org/gephi/graph/api/types/TimestampStringMap.java b/src/main/java/org/gephi/graph/api/types/TimestampStringMap.java index 694365dd..0e3566c0 100644 --- a/src/main/java/org/gephi/graph/api/types/TimestampStringMap.java +++ b/src/main/java/org/gephi/graph/api/types/TimestampStringMap.java @@ -61,6 +61,15 @@ public TimestampStringMap(double[] keys, String[] vals) { System.arraycopy(vals, 0, values, 0, vals.length); } + /** + * Copy constructor. + * + * @param source the map to copy + */ + public TimestampStringMap(TimestampStringMap source) { + this(source.array, source.values); + } + @Override public Class getTypeClass() { return String.class; diff --git a/src/test/java/org/gephi/graph/api/types/IntervalMapTest.java b/src/test/java/org/gephi/graph/api/types/IntervalMapTest.java index 79ba798e..e9f9e0ce 100644 --- a/src/test/java/org/gephi/graph/api/types/IntervalMapTest.java +++ b/src/test/java/org/gephi/graph/api/types/IntervalMapTest.java @@ -592,6 +592,29 @@ public void testToStringDatetime() { Assert.assertEquals(mapInf.toString(TimeFormat.DATETIME), "<[-Infinity, Infinity, value]>"); } + @Test + public void testCopy() { + IntervalStringMap strMap = new IntervalStringMap(new double[] { 1.0, 2.0 }, new String[] { "foo" }); + IntervalByteMap byteMap = new IntervalByteMap(new double[] { 1.0, 2.0 }, new byte[] { 1 }); + IntervalShortMap shortMap = new IntervalShortMap(new double[] { 1.0, 2.0 }, new short[] { 1 }); + IntervalIntegerMap intMap = new IntervalIntegerMap(new double[] { 1.0, 2.0 }, new int[] { 1 }); + IntervalLongMap longMap = new IntervalLongMap(new double[] { 1.0, 2.0 }, new long[] { 1 }); + IntervalFloatMap floatMap = new IntervalFloatMap(new double[] { 1.0, 2.0 }, new float[] { 1 }); + IntervalDoubleMap doubleMap = new IntervalDoubleMap(new double[] { 1.0, 2.0 }, new double[] { 1 }); + IntervalBooleanMap boolMap = new IntervalBooleanMap(new double[] { 1.0, 2.0 }, new boolean[] { true }); + IntervalCharMap charMap = new IntervalCharMap(new double[] { 1.0, 2.0 }, new char[] { 'a' }); + + testEqualsButNotSameUnderlyingArrays(new IntervalStringMap(strMap), strMap); + testEqualsButNotSameUnderlyingArrays(new IntervalByteMap(byteMap), byteMap); + testEqualsButNotSameUnderlyingArrays(new IntervalShortMap(shortMap), shortMap); + testEqualsButNotSameUnderlyingArrays(new IntervalIntegerMap(intMap), intMap); + testEqualsButNotSameUnderlyingArrays(new IntervalLongMap(longMap), longMap); + testEqualsButNotSameUnderlyingArrays(new IntervalFloatMap(floatMap), floatMap); + testEqualsButNotSameUnderlyingArrays(new IntervalDoubleMap(doubleMap), doubleMap); + testEqualsButNotSameUnderlyingArrays(new IntervalBooleanMap(boolMap), boolMap); + testEqualsButNotSameUnderlyingArrays(new IntervalCharMap(charMap), charMap); + } + // UTILITY private void testDoubleArrayEquals(double[] a, double[] b) { Assert.assertEquals(a.length, b.length); @@ -600,6 +623,12 @@ private void testDoubleArrayEquals(double[] a, double[] b) { } } + private void testEqualsButNotSameUnderlyingArrays(IntervalMap a, IntervalMap b) { + Assert.assertEquals(a, b); + Assert.assertNotSame(a.array, b.array); + Assert.assertNotSame(a.getValuesArray(), b.getValuesArray()); + } + private IntervalMap[] getAllInstances() { return new IntervalMap[] { new IntervalStringMap(), new IntervalBooleanMap(), new IntervalFloatMap(), new IntervalDoubleMap(), new IntervalIntegerMap(), new IntervalShortMap(), new IntervalLongMap(), new IntervalByteMap(), new IntervalCharMap() }; } diff --git a/src/test/java/org/gephi/graph/api/types/IntervalSetTest.java b/src/test/java/org/gephi/graph/api/types/IntervalSetTest.java index 106b3a95..b3a7c9e0 100644 --- a/src/test/java/org/gephi/graph/api/types/IntervalSetTest.java +++ b/src/test/java/org/gephi/graph/api/types/IntervalSetTest.java @@ -426,4 +426,14 @@ public void testToStringDatetime() { setInf.add(new Interval(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY)); Assert.assertEquals(setInf.toString(TimeFormat.DATETIME), "<[-Infinity, Infinity]>"); } + + @Test + public void testCopy() { + IntervalSet set1 = new IntervalSet(); + set1.add(new Interval(1.0, 2.0)); + IntervalSet set2 = new IntervalSet(set1); + Assert.assertEquals(set2, set1); + set1.add(new Interval(3.0, 4.0)); + Assert.assertNotEquals(set2, set1); + } } diff --git a/src/test/java/org/gephi/graph/api/types/TimestampMapTest.java b/src/test/java/org/gephi/graph/api/types/TimestampMapTest.java index f22e8573..66aa1ef5 100644 --- a/src/test/java/org/gephi/graph/api/types/TimestampMapTest.java +++ b/src/test/java/org/gephi/graph/api/types/TimestampMapTest.java @@ -694,6 +694,29 @@ public void testToStringDatetime() { Assert.assertEquals(mapInf.toString(TimeFormat.DATETIME), "<[-Infinity, value]; [Infinity, value]>"); } + @Test + public void testCopy() { + TimestampStringMap strMap = new TimestampStringMap(new double[] { 1.0 }, new String[] { "foo" }); + TimestampByteMap byteMap = new TimestampByteMap(new double[] { 1.0 }, new byte[] { 1 }); + TimestampShortMap shortMap = new TimestampShortMap(new double[] { 1.0 }, new short[] { 1 }); + TimestampIntegerMap intMap = new TimestampIntegerMap(new double[] { 1.0 }, new int[] { 1 }); + TimestampLongMap longMap = new TimestampLongMap(new double[] { 1.0 }, new long[] { 1 }); + TimestampFloatMap floatMap = new TimestampFloatMap(new double[] { 1.0 }, new float[] { 1 }); + TimestampDoubleMap doubleMap = new TimestampDoubleMap(new double[] { 1.0 }, new double[] { 1 }); + TimestampCharMap charMap = new TimestampCharMap(new double[] { 1.0 }, new char[] { 'a' }); + TimestampBooleanMap boolMap = new TimestampBooleanMap(new double[] { 1.0 }, new boolean[] { true }); + + testEqualsButNotSameUnderlyingArrays(new TimestampStringMap(strMap), strMap); + testEqualsButNotSameUnderlyingArrays(new TimestampByteMap(byteMap), byteMap); + testEqualsButNotSameUnderlyingArrays(new TimestampShortMap(shortMap), shortMap); + testEqualsButNotSameUnderlyingArrays(new TimestampIntegerMap(intMap), intMap); + testEqualsButNotSameUnderlyingArrays(new TimestampLongMap(longMap), longMap); + testEqualsButNotSameUnderlyingArrays(new TimestampFloatMap(floatMap), floatMap); + testEqualsButNotSameUnderlyingArrays(new TimestampDoubleMap(doubleMap), doubleMap); + testEqualsButNotSameUnderlyingArrays(new TimestampCharMap(charMap), charMap); + testEqualsButNotSameUnderlyingArrays(new TimestampBooleanMap(boolMap), boolMap); + } + // UTILITY private void testDoubleArrayEquals(double[] a, double[] b) { Assert.assertEquals(a.length, b.length); @@ -702,6 +725,12 @@ private void testDoubleArrayEquals(double[] a, double[] b) { } } + private void testEqualsButNotSameUnderlyingArrays(TimestampMap a, TimestampMap b) { + Assert.assertEquals(a, b); + Assert.assertNotSame(a.array, b.array); + Assert.assertNotSame(a.getValuesArray(), b.getValuesArray()); + } + private TimestampMap[] getAllInstances() { return new TimestampMap[] { new TimestampDoubleMap(), new TimestampByteMap(), new TimestampFloatMap(), new TimestampIntegerMap(), new TimestampLongMap(), new TimestampShortMap(), new TimestampStringMap(), new TimestampCharMap(), new TimestampBooleanMap() }; } diff --git a/src/test/java/org/gephi/graph/api/types/TimestampSetTest.java b/src/test/java/org/gephi/graph/api/types/TimestampSetTest.java index c195205f..dc79247c 100644 --- a/src/test/java/org/gephi/graph/api/types/TimestampSetTest.java +++ b/src/test/java/org/gephi/graph/api/types/TimestampSetTest.java @@ -378,6 +378,15 @@ public void testToStringDatetime() { Assert.assertEquals(setInf.toString(TimeFormat.DATETIME), "<[-Infinity, Infinity]>"); } + @Test + public void testCopy() { + TimestampSet set1 = new TimestampSet(); + set1.add(1.0); + TimestampSet set2 = new TimestampSet(set1); + Assert.assertEquals(set2, set1); + Assert.assertNotSame(set2.toPrimitiveArray(), set1.toPrimitiveArray()); + } + // UTILITY private void testDoubleArrayEquals(double[] a, double[] b) { Assert.assertEquals(a.length, b.length); From 23392d83d85907d5164e28b1fbbf4d2ec2f82f84 Mon Sep 17 00:00:00 2001 From: Mathieu Bastian Date: Mon, 1 May 2023 22:11:50 +0200 Subject: [PATCH 2/3] Add AttributeUtile copy --- .../org/gephi/graph/api/AttributeUtils.java | 172 ++++++++++++++++-- .../gephi/graph/impl/AttributeUtilsTest.java | 82 +++++++++ 2 files changed, 239 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/gephi/graph/api/AttributeUtils.java b/src/main/java/org/gephi/graph/api/AttributeUtils.java index a54ef952..9558d629 100644 --- a/src/main/java/org/gephi/graph/api/AttributeUtils.java +++ b/src/main/java/org/gephi/graph/api/AttributeUtils.java @@ -13,6 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ + package org.gephi.graph.api; import it.unimi.dsi.fastutil.booleans.BooleanArrayList; @@ -41,21 +42,6 @@ import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import it.unimi.dsi.fastutil.shorts.ShortArrayList; import it.unimi.dsi.fastutil.shorts.ShortOpenHashSet; -import java.time.format.DateTimeParseException; -import org.gephi.graph.impl.TimestampsParser; -import org.gephi.graph.impl.IntervalsParser; -import org.gephi.graph.impl.FormattingAndParsingUtils; -import org.gephi.graph.api.types.TimestampMap; -import org.gephi.graph.api.types.TimestampShortMap; -import org.gephi.graph.api.types.TimestampLongMap; -import org.gephi.graph.api.types.TimestampSet; -import org.gephi.graph.api.types.TimestampCharMap; -import org.gephi.graph.api.types.TimestampDoubleMap; -import org.gephi.graph.api.types.TimestampBooleanMap; -import org.gephi.graph.api.types.TimestampFloatMap; -import org.gephi.graph.api.types.TimestampStringMap; -import org.gephi.graph.api.types.TimestampByteMap; -import org.gephi.graph.api.types.TimestampIntegerMap; import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.BigInteger; @@ -67,6 +53,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; import java.util.Collections; import java.util.HashMap; @@ -88,8 +75,22 @@ import org.gephi.graph.api.types.IntervalStringMap; import org.gephi.graph.api.types.TimeMap; import org.gephi.graph.api.types.TimeSet; +import org.gephi.graph.api.types.TimestampBooleanMap; +import org.gephi.graph.api.types.TimestampByteMap; +import org.gephi.graph.api.types.TimestampCharMap; +import org.gephi.graph.api.types.TimestampDoubleMap; +import org.gephi.graph.api.types.TimestampFloatMap; +import org.gephi.graph.api.types.TimestampIntegerMap; +import org.gephi.graph.api.types.TimestampLongMap; +import org.gephi.graph.api.types.TimestampMap; +import org.gephi.graph.api.types.TimestampSet; +import org.gephi.graph.api.types.TimestampShortMap; +import org.gephi.graph.api.types.TimestampStringMap; import org.gephi.graph.impl.ArraysParser; +import org.gephi.graph.impl.FormattingAndParsingUtils; import org.gephi.graph.impl.GraphStoreConfiguration; +import org.gephi.graph.impl.IntervalsParser; +import org.gephi.graph.impl.TimestampsParser; /** * Set of utility methods to manipulate supported attribute types. @@ -1215,4 +1216,145 @@ public static boolean isNodeColumn(Column colum) { public static boolean isEdgeColumn(Column colum) { return colum.getTable().getElementClass().equals(Edge.class); } + + /** + * Returns a copy of the provided object. + *

+ * The copy is a deep copy for arrays, {@link IntervalSet}, + * {@link TimestampSet}, sets and lists + * + * @param obj object to copy + * @return copy of the provided object + */ + public static Object copy(Object obj) { + Class typeClass = obj.getClass(); + if (!isSupported(typeClass)) { + throw new IllegalArgumentException("Unsupported type " + typeClass.getCanonicalName()); + } + typeClass = getStandardizedType(typeClass); + obj = standardizeValue(obj); + + // Primitive + if (isSimpleType(typeClass)) { + return obj; + } + + // Interval types: + if (typeClass.equals(IntervalSet.class)) { + return new IntervalSet((IntervalSet) obj); + } else if (typeClass.equals(IntervalStringMap.class)) { + return new IntervalStringMap((IntervalStringMap) obj); + } else if (typeClass.equals(IntervalByteMap.class)) { + return new IntervalByteMap((IntervalByteMap) obj); + } else if (typeClass.equals(IntervalShortMap.class)) { + return new IntervalShortMap((IntervalShortMap) obj); + } else if (typeClass.equals(IntervalIntegerMap.class)) { + return new IntervalIntegerMap((IntervalIntegerMap) obj); + } else if (typeClass.equals(IntervalLongMap.class)) { + return new IntervalLongMap((IntervalLongMap) obj); + } else if (typeClass.equals(IntervalFloatMap.class)) { + return new IntervalFloatMap((IntervalFloatMap) obj); + } else if (typeClass.equals(IntervalDoubleMap.class)) { + return new IntervalDoubleMap((IntervalDoubleMap) obj); + } else if (typeClass.equals(IntervalBooleanMap.class)) { + return new IntervalBooleanMap((IntervalBooleanMap) obj); + } else if (typeClass.equals(IntervalCharMap.class)) { + return new IntervalCharMap((IntervalCharMap) obj); + } + + // Timestamp types: + if (typeClass.equals(TimestampSet.class)) { + return new TimestampSet((TimestampSet) obj); + } else if (typeClass.equals(TimestampStringMap.class)) { + return new TimestampStringMap((TimestampStringMap) obj); + } else if (typeClass.equals(TimestampByteMap.class)) { + return new TimestampByteMap((TimestampByteMap) obj); + } else if (typeClass.equals(TimestampShortMap.class)) { + return new TimestampShortMap((TimestampShortMap) obj); + } else if (typeClass.equals(TimestampIntegerMap.class)) { + return new TimestampIntegerMap((TimestampIntegerMap) obj); + } else if (typeClass.equals(TimestampLongMap.class)) { + return new TimestampLongMap((TimestampLongMap) obj); + } else if (typeClass.equals(TimestampFloatMap.class)) { + return new TimestampFloatMap((TimestampFloatMap) obj); + } else if (typeClass.equals(TimestampDoubleMap.class)) { + return new TimestampDoubleMap((TimestampDoubleMap) obj); + } else if (typeClass.equals(TimestampBooleanMap.class)) { + return new TimestampBooleanMap((TimestampBooleanMap) obj); + } else if (typeClass.equals(TimestampCharMap.class)) { + return new TimestampCharMap((TimestampCharMap) obj); + } + + // Array + if (isArrayType(typeClass)) { + Class componentType = typeClass.getComponentType(); + int length = Array.getLength(obj); + Object dest = Array.newInstance(componentType, length); + System.arraycopy(obj, 0, dest, 0, length); + return dest; + } + + // List + if (obj instanceof CharArrayList) { + return new CharArrayList((CharArrayList) obj); + } else if (obj instanceof BooleanArrayList) { + return new BooleanArrayList((BooleanArrayList) obj); + } else if (obj instanceof ByteArrayList) { + return new ByteArrayList((ByteArrayList) obj); + } else if (obj instanceof ShortArrayList) { + return new ShortArrayList((ShortArrayList) obj); + } else if (obj instanceof IntArrayList) { + return new IntArrayList((IntArrayList) obj); + } else if (obj instanceof LongArrayList) { + return new LongArrayList((LongArrayList) obj); + } else if (obj instanceof FloatArrayList) { + return new FloatArrayList((FloatArrayList) obj); + } else if (obj instanceof DoubleArrayList) { + return new DoubleArrayList((DoubleArrayList) obj); + } else if (obj instanceof ObjectArrayList) { + return new ObjectArrayList((ObjectArrayList) obj); + } + + // Map + if (obj instanceof Char2ObjectOpenHashMap) { + return new Char2ObjectOpenHashMap((Char2ObjectOpenHashMap) obj); + } else if (obj instanceof Byte2ObjectOpenHashMap) { + return new Byte2ObjectOpenHashMap((Byte2ObjectOpenHashMap) obj); + } else if (obj instanceof Short2ObjectOpenHashMap) { + return new Short2ObjectOpenHashMap((Short2ObjectOpenHashMap) obj); + } else if (obj instanceof Int2ObjectOpenHashMap) { + return new Int2ObjectOpenHashMap((Int2ObjectOpenHashMap) obj); + } else if (obj instanceof Long2ObjectOpenHashMap) { + return new Long2ObjectOpenHashMap((Long2ObjectOpenHashMap) obj); + } else if (obj instanceof Float2ObjectOpenHashMap) { + return new Float2ObjectOpenHashMap((Float2ObjectOpenHashMap) obj); + } else if (obj instanceof Double2ObjectOpenHashMap) { + return new Double2ObjectOpenHashMap((Double2ObjectOpenHashMap) obj); + } else if (obj instanceof Object2ObjectOpenHashMap) { + return new Object2ObjectOpenHashMap((Object2ObjectOpenHashMap) obj); + } + + // Set + if (obj instanceof CharOpenHashSet) { + return new CharOpenHashSet((CharOpenHashSet) obj); + } else if (obj instanceof BooleanOpenHashSet) { + return new BooleanOpenHashSet((BooleanOpenHashSet) obj); + } else if (obj instanceof ByteOpenHashSet) { + return new ByteOpenHashSet((ByteOpenHashSet) obj); + } else if (obj instanceof ShortOpenHashSet) { + return new ShortOpenHashSet((ShortOpenHashSet) obj); + } else if (obj instanceof IntOpenHashSet) { + return new IntOpenHashSet((IntOpenHashSet) obj); + } else if (obj instanceof LongOpenHashSet) { + return new LongOpenHashSet((LongOpenHashSet) obj); + } else if (obj instanceof FloatOpenHashSet) { + return new FloatOpenHashSet((FloatOpenHashSet) obj); + } else if (obj instanceof DoubleOpenHashSet) { + return new DoubleOpenHashSet((DoubleOpenHashSet) obj); + } else if (obj instanceof ObjectOpenHashSet) { + return new ObjectOpenHashSet((ObjectOpenHashSet) obj); + } + + return obj; + } } diff --git a/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java b/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java index 6667ce6c..2825c767 100644 --- a/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java +++ b/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java @@ -887,4 +887,86 @@ public void testIsSimpleType() { Assert.assertFalse(AttributeUtils.isSimpleType(TimestampBooleanMap.class)); Assert.assertFalse(AttributeUtils.isSimpleType(IntervalBooleanMap.class)); } + + @Test + public void testCopyPrimitive() { + String str = "foo"; + Assert.assertSame(AttributeUtils.copy(str), str); + int bar = 42; + Assert.assertSame(AttributeUtils.copy(bar), bar); + } + + @Test + public void testCopyIntervalSet() { + IntervalStringMap strMap = new IntervalStringMap(new double[] { 1.0, 2.0 }, new String[] { "foo" }); + IntervalByteMap byteMap = new IntervalByteMap(new double[] { 1.0, 2.0 }, new byte[] { 1 }); + IntervalShortMap shortMap = new IntervalShortMap(new double[] { 1.0, 2.0 }, new short[] { 1 }); + IntervalIntegerMap intMap = new IntervalIntegerMap(new double[] { 1.0, 2.0 }, new int[] { 1 }); + IntervalLongMap longMap = new IntervalLongMap(new double[] { 1.0, 2.0 }, new long[] { 1 }); + IntervalFloatMap floatMap = new IntervalFloatMap(new double[] { 1.0, 2.0 }, new float[] { 1 }); + IntervalDoubleMap doubleMap = new IntervalDoubleMap(new double[] { 1.0, 2.0 }, new double[] { 1 }); + IntervalBooleanMap boolMap = new IntervalBooleanMap(new double[] { 1.0, 2.0 }, new boolean[] { true }); + IntervalCharMap charMap = new IntervalCharMap(new double[] { 1.0, 2.0 }, new char[] { 'a' }); + + assertCopyIsEqualsButNotSame(strMap); + assertCopyIsEqualsButNotSame(byteMap); + assertCopyIsEqualsButNotSame(shortMap); + assertCopyIsEqualsButNotSame(intMap); + assertCopyIsEqualsButNotSame(longMap); + assertCopyIsEqualsButNotSame(floatMap); + assertCopyIsEqualsButNotSame(doubleMap); + assertCopyIsEqualsButNotSame(boolMap); + assertCopyIsEqualsButNotSame(charMap); + } + + @Test + public void testCopyTimestampSet() { + TimestampStringMap strMap = new TimestampStringMap(new double[] { 1.0 }, new String[] { "foo" }); + TimestampByteMap byteMap = new TimestampByteMap(new double[] { 1.0 }, new byte[] { 1 }); + TimestampShortMap shortMap = new TimestampShortMap(new double[] { 1.0 }, new short[] { 1 }); + TimestampIntegerMap intMap = new TimestampIntegerMap(new double[] { 1.0 }, new int[] { 1 }); + TimestampLongMap longMap = new TimestampLongMap(new double[] { 1.0 }, new long[] { 1 }); + TimestampFloatMap floatMap = new TimestampFloatMap(new double[] { 1.0 }, new float[] { 1 }); + TimestampDoubleMap doubleMap = new TimestampDoubleMap(new double[] { 1.0 }, new double[] { 1 }); + TimestampCharMap charMap = new TimestampCharMap(new double[] { 1.0 }, new char[] { 'a' }); + TimestampBooleanMap boolMap = new TimestampBooleanMap(new double[] { 1.0 }, new boolean[] { true }); + + assertCopyIsEqualsButNotSame(strMap); + assertCopyIsEqualsButNotSame(byteMap); + assertCopyIsEqualsButNotSame(shortMap); + assertCopyIsEqualsButNotSame(intMap); + assertCopyIsEqualsButNotSame(longMap); + assertCopyIsEqualsButNotSame(floatMap); + assertCopyIsEqualsButNotSame(doubleMap); + assertCopyIsEqualsButNotSame(charMap); + assertCopyIsEqualsButNotSame(boolMap); + } + + @Test + public void testCopyList() { + List list = new ArrayList(); + list.add("foo"); + assertCopyIsEqualsButNotSame(list); + } + + @Test + public void testCopySet() { + Set set = new HashSet(); + set.add("foo"); + assertCopyIsEqualsButNotSame(set); + } + + @Test + public void testCopyMap() { + Map map = new HashMap(); + map.put("foo", "bar"); + assertCopyIsEqualsButNotSame(map); + } + + // Utility + private void assertCopyIsEqualsButNotSame(Object o) { + Object copy = AttributeUtils.copy(o); + Assert.assertEquals(copy, o); + Assert.assertNotSame(copy, o); + } } From a7247bc9692ccbf4c11b78241e186debd8322000 Mon Sep 17 00:00:00 2001 From: Mathieu Bastian Date: Mon, 1 May 2023 22:27:34 +0200 Subject: [PATCH 3/3] Fix graph bridge copy --- .../org/gephi/graph/api/AttributeUtils.java | 3 ++ .../org/gephi/graph/api/Configuration.java | 1 + .../org/gephi/graph/impl/ElementImpl.java | 10 +++- .../org/gephi/graph/impl/GraphBridgeImpl.java | 23 ++------- .../gephi/graph/impl/AttributeUtilsTest.java | 5 ++ .../org/gephi/graph/impl/ElementImplTest.java | 9 ++++ .../org/gephi/graph/impl/GraphBridgeTest.java | 47 ++++++++++++++++++- 7 files changed, 77 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/gephi/graph/api/AttributeUtils.java b/src/main/java/org/gephi/graph/api/AttributeUtils.java index 9558d629..1aa24d74 100644 --- a/src/main/java/org/gephi/graph/api/AttributeUtils.java +++ b/src/main/java/org/gephi/graph/api/AttributeUtils.java @@ -1227,6 +1227,9 @@ public static boolean isEdgeColumn(Column colum) { * @return copy of the provided object */ public static Object copy(Object obj) { + if (obj == null) { + return null; + } Class typeClass = obj.getClass(); if (!isSupported(typeClass)) { throw new IllegalArgumentException("Unsupported type " + typeClass.getCanonicalName()); diff --git a/src/main/java/org/gephi/graph/api/Configuration.java b/src/main/java/org/gephi/graph/api/Configuration.java index adafe2b0..0c24fd45 100644 --- a/src/main/java/org/gephi/graph/api/Configuration.java +++ b/src/main/java/org/gephi/graph/api/Configuration.java @@ -27,6 +27,7 @@ * create a GraphModel with custom configuration. *

* Create instances by using the builder: + * *

  * Configuration config = Configuration.builder().build();
  * 
diff --git a/src/main/java/org/gephi/graph/impl/ElementImpl.java b/src/main/java/org/gephi/graph/impl/ElementImpl.java index 71a2f3d7..b47f66df 100644 --- a/src/main/java/org/gephi/graph/impl/ElementImpl.java +++ b/src/main/java/org/gephi/graph/impl/ElementImpl.java @@ -414,7 +414,7 @@ public boolean hasInterval(Interval interval) { @Override public Iterable getAttributes(Column column) { checkColumn(column); - checkColumnDynamic(column); + checkColumnDynamicAttribute(column); return attributes.getAttributes(column); } @@ -547,11 +547,17 @@ void checkReadOnlyColumn(Column column) { } void checkColumnDynamic(Column column) { - if (!((ColumnImpl) column).isDynamic()) { + if (!column.isDynamic()) { throw new IllegalArgumentException("The column is not dynamic"); } } + void checkColumnDynamicAttribute(Column column) { + if (!column.isDynamicAttribute()) { + throw new IllegalArgumentException("The column is not a dynamic attribute"); + } + } + void checkType(Column column, Object value) { if (value != null) { Class typeClass = column.getTypeClass(); diff --git a/src/main/java/org/gephi/graph/impl/GraphBridgeImpl.java b/src/main/java/org/gephi/graph/impl/GraphBridgeImpl.java index 41ee1cf0..34f80814 100644 --- a/src/main/java/org/gephi/graph/impl/GraphBridgeImpl.java +++ b/src/main/java/org/gephi/graph/impl/GraphBridgeImpl.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.gephi.graph.api.AttributeUtils; import org.gephi.graph.api.Column; import org.gephi.graph.api.Configuration; import org.gephi.graph.api.Edge; @@ -185,12 +186,14 @@ private void copyTextProperties(TextProperties text, TextProperties textCopy) { textCopy.setColor(text.getColor()); textCopy.setSize(text.getSize()); textCopy.setVisible(text.isVisible()); + textCopy.setText(text.getText()); + textCopy.setDimensions(text.getWidth(), text.getHeight()); } private void copyTimeSet(Element element, Element elementCopy) { Column sourceColumn = element.getTable().getColumn(GraphStoreConfiguration.ELEMENT_TIMESET_INDEX); Column destColumn = elementCopy.getTable().getColumn(GraphStoreConfiguration.ELEMENT_TIMESET_INDEX); - elementCopy.setAttribute(destColumn, element.getAttribute(sourceColumn)); + elementCopy.setAttribute(destColumn, AttributeUtils.copy(element.getAttribute(sourceColumn))); } private void copyColumns(TableImpl sourceTable, TableImpl destTable) { @@ -203,26 +206,10 @@ private void copyColumns(TableImpl sourceTable, TableImpl destTable) { } private void copyAttributes(TableImpl sourceTable, TableImpl destTable, Element element, Element elementCopy) { - TimeRepresentation tr = sourceTable.store.graphStore.configuration.getTimeRepresentation(); for (Column col : sourceTable.toArray()) { if (!col.isProperty()) { Column colCopy = destTable.getColumn(col.getId()); - if (col.isDynamic() && tr.equals(TimeRepresentation.TIMESTAMP)) { - for (Map.Entry entry : element.getAttributes(col)) { - Double key = entry.getKey(); - Object value = entry.getValue(); - elementCopy.setAttribute(colCopy, value, key); - } - } else if (col.isDynamic() && tr.equals(TimeRepresentation.INTERVAL)) { - for (Map.Entry entry : element.getAttributes(col)) { - Interval key = entry.getKey(); - Object value = entry.getValue(); - elementCopy.setAttribute(colCopy, value, key); - } - } else { - Object attribute = element.getAttribute(col); - elementCopy.setAttribute(colCopy, attribute); - } + elementCopy.setAttribute(colCopy, AttributeUtils.copy(element.getAttribute(col))); } } } diff --git a/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java b/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java index 2825c767..57e2415b 100644 --- a/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java +++ b/src/test/java/org/gephi/graph/impl/AttributeUtilsTest.java @@ -888,6 +888,11 @@ public void testIsSimpleType() { Assert.assertFalse(AttributeUtils.isSimpleType(IntervalBooleanMap.class)); } + @Test + public void testCopyNull() { + Assert.assertNull(AttributeUtils.copy(null)); + } + @Test public void testCopyPrimitive() { String str = "foo"; diff --git a/src/test/java/org/gephi/graph/impl/ElementImplTest.java b/src/test/java/org/gephi/graph/impl/ElementImplTest.java index 2b37108d..2b058b0e 100644 --- a/src/test/java/org/gephi/graph/impl/ElementImplTest.java +++ b/src/test/java/org/gephi/graph/impl/ElementImplTest.java @@ -1058,6 +1058,15 @@ public void testGetDynamicAttributesStaticColumn() { node.getAttributes(column); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetDynamicAttributesTimeset() { + GraphStore store = new GraphStore(); + Column column = store.defaultColumns.nodeTimeSet(); + + NodeImpl node = new NodeImpl("0", store); + node.getAttributes(column); + } + @Test public void testGetAttributeInView() { GraphStore store = new GraphStore(); diff --git a/src/test/java/org/gephi/graph/impl/GraphBridgeTest.java b/src/test/java/org/gephi/graph/impl/GraphBridgeTest.java index fabdd91f..1bc1da3c 100644 --- a/src/test/java/org/gephi/graph/impl/GraphBridgeTest.java +++ b/src/test/java/org/gephi/graph/impl/GraphBridgeTest.java @@ -29,6 +29,7 @@ import org.gephi.graph.api.types.IntervalIntegerMap; import org.gephi.graph.api.types.TimestampDoubleMap; import org.gephi.graph.api.types.TimestampIntegerMap; +import org.gephi.graph.api.types.TimestampSet; import org.testng.Assert; import org.testng.annotations.Test; @@ -151,6 +152,8 @@ public void testCopyNodeTextProperties() { n1.getTextProperties().setAlpha(0.5f); n1.getTextProperties().setSize(5f); n1.getTextProperties().setVisible(false); + n1.getTextProperties().setText("foo"); + n1.getTextProperties().setDimensions(2f, 3f); GraphStore dest = new GraphStore(); new GraphBridgeImpl(dest).copyNodes(source.getNodes().toArray()); @@ -167,6 +170,8 @@ public void testCopyEdgeTextProperties() { e0.getTextProperties().setAlpha(0.5f); e0.getTextProperties().setSize(5f); e0.getTextProperties().setVisible(false); + e0.getTextProperties().setText("foo"); + e0.getTextProperties().setDimensions(2f, 3f); GraphStore dest = new GraphStore(); new GraphBridgeImpl(dest).copyNodes(source.getNodes().toArray()); @@ -214,7 +219,6 @@ public void testCopyEdgeWeightInterval() { e0.setWeight(42.0, new Interval(1.0, 2.0)); e0.setWeight(5.0, new Interval(3.0, 4.0)); - config.setTimeRepresentation(TimeRepresentation.INTERVAL); GraphModelImpl gm = new GraphModelImpl(config); GraphStore dest = gm.store; new GraphBridgeImpl(dest).copyNodes(source.getNodes().toArray()); @@ -350,6 +354,8 @@ public void testCopyTimestampSet() { Node n1Copy = dest.getNode("1"); Assert.assertTrue(n1Copy.hasTimestamp(42.0)); + n1.addTimestamp(43.0); + Assert.assertFalse(n1Copy.hasTimestamp(43.0)); } @Test @@ -365,5 +371,44 @@ public void testCopyIntervalSet() { Node n1Copy = dest.getNode("1"); Assert.assertTrue(n1Copy.hasInterval(new Interval(1.0, 2.0))); + n1.addInterval(new Interval(3.0, 4.0)); + Assert.assertFalse(n1Copy.hasInterval(new Interval(3.0, 4.0))); + } + + @Test + public void testCopyArray() { + GraphStore source = GraphGenerator.generateTinyGraphStore(); + Column c1 = source.nodeTable.addColumn("foo", int[].class); + Node n1 = source.getNode("1"); + int[] a1 = new int[] { 1, 2, 3 }; + n1.setAttribute(c1, a1); + + GraphModelImpl model = new GraphModelImpl(); + GraphStore dest = model.store; + new GraphBridgeImpl(dest).copyNodes(source.getNodes().toArray()); + + Node n1Copy = dest.getNode("1"); + Assert.assertEquals(n1Copy.getAttribute(c1.getId()), a1); + a1[0] = 4; + Assert.assertNotEquals(n1Copy.getAttribute(c1.getId()), a1); + } + + @Test + public void testCopyOtherTimesetColumn() { + GraphStore source = GraphGenerator.generateTinyGraphStore(); + Column c1 = source.nodeTable.addColumn("foo", TimestampSet.class); + Node n1 = source.getNode("1"); + TimestampSet set = new TimestampSet(); + set.add(42.0); + n1.setAttribute(c1, set); + + GraphModelImpl model = new GraphModelImpl(); + GraphStore dest = model.store; + new GraphBridgeImpl(dest).copyNodes(source.getNodes().toArray()); + + Node n1Copy = dest.getNode("1"); + Assert.assertEquals(n1Copy.getAttribute(c1.getId()), set); + set.add(43.0); + Assert.assertNotEquals(n1Copy.getAttribute(c1.getId()), set); } }