Prechádzať zdrojové kódy

new: CQuery: concatenation

Ranides Atterwim 6 rokov pred
rodič
commit
c71ac1d805

+ 3 - 1
assira/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -35,7 +35,9 @@ public interface CQuery<T> extends Iterable<T> {
     Set<T> set();
 
     CQuery<T> fetch();
-    
+
+    CQuery<T> append(CQuery<T> next);
+
     <K> Map<K,T> group(Function<? super T, ? extends K> key);
     
     <K,V> Map<K,V> group(Function<? super T, ? extends K> key, Function<? super T, ? extends V> value);

+ 40 - 1
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -56,6 +56,11 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return stream().collect(Collectors.toSet());
     }
 
+    @Override
+    public CQuery<T> append(CQuery<T> next) {
+        return new CQMerge<>(this, next);
+    }
+
     @Override
     public final CQuery<T> fetch() {
         return CQueryBuilder.fromCollection(list());
@@ -464,7 +469,41 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         }
         
     }
-    
+
+    protected static class CQMerge<T> extends CQueryAbstract<T> {
+
+        private final List<CQuery<T>> source;
+
+        public CQMerge(CQuery<T> a, CQuery<T> b) {
+            this.source = Arrays.asList(a,b);
+        }
+
+        public CQMerge(CQMerge<T> a, CQuery<T> b) {
+            this.source = new ArrayList<>(a.source);
+            this.source.add(b);
+        }
+
+        @Override
+        public Stream<T> stream() {
+            return source.stream().flatMap(CQuery::stream);
+        }
+
+        @Override
+        public int size() {
+            return source.stream().map(CQuery::size).reduce(0, Integer::sum);
+        }
+
+        @Override
+        public Iterator<T> iterator() {
+            return source.stream().flatMap(CQuery::stream).iterator();
+        }
+
+        @Override
+        public CQuery<T> append(CQuery<T> next) {
+            return new CQMerge<>(this, next);
+        }
+    }
+
     private static final class BIterator<T> implements Iterator<T> {
         
         private final Iterator<T> src;

+ 19 - 0
assira/src/main/java/net/ranides/assira/collection/query/CQueryUtils.java

@@ -0,0 +1,19 @@
+package net.ranides.assira.collection.query;
+
+import lombok.experimental.UtilityClass;
+
+import java.util.Collection;
+
+@UtilityClass
+public class CQueryUtils {
+
+    @SafeVarargs
+    public static <T, C extends Collection<? super T>> C into(C target, CQuery<? extends T>... queries) {
+        for(CQuery<? extends T> query : queries) {
+            query.into(target);
+        }
+        return target;
+    }
+
+
+}

+ 24 - 0
assira/src/test/java/net/ranides/assira/collection/query/CQueryUtilsTest.java

@@ -0,0 +1,24 @@
+package net.ranides.assira.collection.query;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+public class CQueryUtilsTest {
+
+    @Test
+    public void into() {
+        CQuery<Integer> q1 = CQueryBuilder.fromCollection(Arrays.asList(1, 2, 3));
+        CQuery<Integer> q2 = CQueryBuilder.fromCollection(Arrays.asList(5,4,3,6));
+        CQuery<Integer> q3 = CQueryBuilder.fromCollection(Arrays.asList(1,7,8,9,5));
+
+        Set<Integer> set = CQueryUtils.into(new LinkedHashSet<>(), q1, q2, q3);
+
+        assertEquals(Arrays.asList(1,2,3,5,4,6,7,8,9), new ArrayList<>(set));
+    }
+}