This is an automated email from the ASF dual-hosted git repository. irakov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new 5cafd44 IGNITE-12447 Modification of S#compact method - Fixes #7139. 5cafd44 is described below commit 5cafd4408dadf172b23b52cb2e278bd3d66b6f52 Author: Kirill Tkalenko <tkalkir...@yandex.ru> AuthorDate: Fri Jan 31 12:18:08 2020 +0300 IGNITE-12447 Modification of S#compact method - Fixes #7139. Signed-off-by: Ivan Rakov <ira...@apache.org> --- .../util/tostring/GridToStringBuilder.java | 35 ++++++++-- .../util/tostring/GridToStringBuilderSelfTest.java | 79 ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 7 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/tostring/GridToStringBuilder.java b/modules/core/src/main/java/org/apache/ignite/internal/util/tostring/GridToStringBuilder.java index 58abd55..4dd3741 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/tostring/GridToStringBuilder.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/tostring/GridToStringBuilder.java @@ -38,6 +38,7 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.function.Supplier; +import java.util.function.Function; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.util.GridUnsafe; @@ -1832,26 +1833,46 @@ public class GridToStringBuilder { * @param col Collection of integers. * @return Compacted string representation of given collections. */ - public static String compact(@NotNull Collection<Integer> col) { + public static String compact(Collection<Integer> col) { + return compact(col, i -> i + 1); + } + + /** + * Returns sorted and compacted string representation of given {@code col}. + * Two nearby numbers are compacted to one continuous segment. + * E.g. collection of [1, 2, 3, 5, 6, 7, 10] with + * {@code nextValFun = i -> i + 1} will be compacted to [1-3, 5-7, 10]. + * + * @param col Collection of numbers. + * @param nextValFun Function to get nearby number. + * @return Compacted string representation of given collections. + */ + public static <T extends Number & Comparable<? super T>> String compact( + Collection<T> col, + Function<T, T> nextValFun + ) { + assert nonNull(col); + assert nonNull(nextValFun); + if (col.isEmpty()) return "[]"; SB sb = new SB(); sb.a('['); - List<Integer> l = new ArrayList<>(col); + List<T> l = new ArrayList<>(col); Collections.sort(l); - int left = l.get(0), right = left; + T left = l.get(0), right = left; for (int i = 1; i < l.size(); i++) { - int val = l.get(i); + T val = l.get(i); - if (right == val || right + 1 == val) { + if (right.compareTo(val) == 0 || nextValFun.apply(right).compareTo(val) == 0) { right = val; continue; } - if (left == right) + if (left.compareTo(right) == 0) sb.a(left); else sb.a(left).a('-').a(right); @@ -1861,7 +1882,7 @@ public class GridToStringBuilder { left = right = val; } - if (left == right) + if (left.compareTo(right) == 0) sb.a(left); else sb.a(left).a('-').a(right); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/tostring/GridToStringBuilderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/tostring/GridToStringBuilderSelfTest.java index bd57a6d..108ef42 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/tostring/GridToStringBuilderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/tostring/GridToStringBuilderSelfTest.java @@ -22,6 +22,7 @@ import java.lang.management.ManagementFactory; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,6 +31,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.locks.ReadWriteLock; +import java.util.function.Function; import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.IgniteInternalFuture; @@ -41,8 +43,11 @@ import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonTest; import org.junit.Test; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static org.apache.ignite.IgniteSystemProperties.IGNITE_TO_STRING_COLLECTION_LIMIT; import static org.apache.ignite.IgniteSystemProperties.IGNITE_TO_STRING_MAX_LENGTH; +import static org.apache.ignite.internal.util.tostring.GridToStringBuilder.compact; import static org.apache.ignite.internal.util.tostring.GridToStringBuilder.identity; /** @@ -586,6 +591,80 @@ public class GridToStringBuilderSelfTest extends GridCommonAbstractTest { allocated1 - allocated0 < 1_000_000); } + + + /** + * Checking that method + * {@link GridToStringBuilder#compact(Collection, Function) compact} works + * correctly for {@link Integer}. + */ + @Test + public void testCompactIntegers() { + List<Integer> emptyList = emptyList(); + List<Integer> intList = asList(1, 2, 3, 9, 8, 7, 12); + + String compactStr = "[1-3, 7-9, 12]"; + + Function<Integer, Integer> nextVal = i -> i + 1; + + checkCompact(emptyList, intList, nextVal, compactStr); + + assertEquals("[]", compact(emptyList)); + assertEquals(compactStr, compact(intList)); + } + + /** + * Checking that method + * {@link GridToStringBuilder#compact(Collection, Function) compact} works + * correctly for {@link Double}. + */ + @Test + public void testCompactDoubles() { + checkCompact( + emptyList(), + asList(1.0, 2.0, 3.0, 9.0, 8.0, 7.0, 12.0), + i -> i + 1.0, + "[1.0-3.0, 7.0-9.0, 12.0]" + ); + } + + /** + * Checking that method + * {@link GridToStringBuilder#compact(Collection, Function) compact} works + * correctly for {@link Long}. + */ + @Test + public void testCompactLongs() { + checkCompact( + emptyList(), + asList(1L, 2L, 3L, 9L, 8L, 7L, 12L), + i -> i + 1L, + "[1-3, 7-9, 12]" + ); + } + + /** + * Checking the correct operation of method + * {@link GridToStringBuilder#compact(Collection, Function) compact}. + * For an empty collection of numbers, "[] " is expected, and for a + * non-empty collection, the value of the parameter {@code numCol} is + * expected. + * + * @param emptyCol Empty collection. + * @param numCol Not an empty collection of numbers. + * @param nextNum Function for getting the next number. + * @param compactStr Expected compact string for param {@code numCol}. + */ + private <T extends Number & Comparable<? super T>> void checkCompact( + Collection<T> emptyCol, + Collection<T> numCol, + Function<T, T> nextNum, + String compactStr + ) { + assertEquals("[]", compact(emptyCol, nextNum)); + assertEquals(compactStr, compact(numCol, nextNum)); + } + /** * @param exp Expected. * @param w Wrapper.