METAMODEL-63: Slight redesign to introduce building block InvokableQuery 146/head
authorKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Thu, 8 Jun 2017 04:39:27 +0000 (21:39 -0700)
committerKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Thu, 8 Jun 2017 04:39:27 +0000 (21:39 -0700)
CHANGES.md
core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
core/src/main/java/org/apache/metamodel/query/DefaultInvokableQuery.java [new file with mode: 0644]
core/src/main/java/org/apache/metamodel/query/InvokableQuery.java [new file with mode: 0644]
core/src/main/java/org/apache/metamodel/query/Query.java
core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java
core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java

index 1da125a..b2cb95b 100644 (file)
@@ -1,7 +1,7 @@
 ### Apache MetaModel 5.0
 
  * [METAMODEL-6] - Added update summary containing information about changes on returning UpdateableDataContext.executeUpdate(..)
- * [METAMODEL-63] - Added UnionDataSet, a general purpose utility for doing client-side unions.
+ * [METAMODEL-63] - Added UnionDataSet, a general purpose utility for doing client-side unions from other queries or data sets.
  * [METAMODEL-222] - Added support for Java 8 lambdas, removed support for Java 7.
  * [METAMODEL-1087] - Removed deprecated APIs from MetaModel's codebase.
  * [METAMODEL-1139] - Employed Java 8 functional types (java.util.function) in favor of (now deprecated) Ref, Action, Func. 
index cd46591..f616ddc 100644 (file)
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.query.SelectItem;
@@ -60,7 +61,7 @@ public abstract class AbstractDataSet extends BaseObject implements DataSet {
     }
 
     public AbstractDataSet(DataSetHeader header) {
-        _header = header;
+        _header = Objects.requireNonNull(header);
     }
 
     public AbstractDataSet(Column[] columns) {
index 1391428..7962f56 100644 (file)
@@ -21,28 +21,38 @@ package org.apache.metamodel.data;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Objects;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.metamodel.query.InvokableQuery;
 import org.apache.metamodel.util.ImmutableRef;
 
 /**
  * A {@link DataSet} that represents the union of two or more other data sets
  */
-public class UnionDataSet extends AbstractDataSet {
+public class UnionDataSet extends AbstractDataSet implements WrappingDataSet {
 
     private final Iterable<Supplier<DataSet>> _dataSetProviders;
     private Iterator<Supplier<DataSet>> _iterator;
     private DataSet _currentDataSet;
 
-    public UnionDataSet(DataSetHeader header, Collection<DataSet> dataSets) {
-        this(header, dataSets.stream().map(ds -> ImmutableRef.of(ds)).collect(Collectors.toList()));
+    public static DataSet ofQueries(DataSetHeader header, Collection<InvokableQuery> queries) {
+        final Function<InvokableQuery, Supplier<DataSet>> mapper = q -> {
+            return () -> {
+                return q.execute();
+            };
+        };
+        return new UnionDataSet(header, queries.stream().map(mapper).collect(Collectors.toList()));
     }
 
-    public UnionDataSet(DataSetHeader header, Iterable<Supplier<DataSet>> dataSetProviders) {
+    public static DataSet ofDataSets(DataSetHeader header, Collection<DataSet> dataSets) {
+        return new UnionDataSet(header, dataSets.stream().map(ds -> ImmutableRef.of(ds)).collect(Collectors.toList()));
+    }
+
+    private UnionDataSet(DataSetHeader header, Iterable<Supplier<DataSet>> dataSetProviders) {
         super(header);
-        Objects.nonNull(dataSetProviders);
-        _dataSetProviders = dataSetProviders;
+        _dataSetProviders = Objects.requireNonNull(dataSetProviders);
     }
 
     @Override
@@ -70,4 +80,8 @@ public class UnionDataSet extends AbstractDataSet {
         return _currentDataSet.getRow();
     }
 
+    @Override
+    public DataSet getWrappedDataSet() {
+        return _currentDataSet;
+    }
 }
diff --git a/core/src/main/java/org/apache/metamodel/query/DefaultInvokableQuery.java b/core/src/main/java/org/apache/metamodel/query/DefaultInvokableQuery.java
new file mode 100644 (file)
index 0000000..368ce2b
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.query;
+
+import java.util.Objects;
+
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.data.DataSet;
+
+/**
+ * Default implementation of {@link InvokableQuery}, based on a ready to go {@link Query} and it's {@link DataContext}.
+ */
+final class DefaultInvokableQuery implements InvokableQuery {
+
+    private final Query _query;
+    private final DataContext _dataContext;
+
+    public DefaultInvokableQuery(Query query, DataContext dataContext) {
+        _query = Objects.requireNonNull(query);
+        _dataContext = Objects.requireNonNull(dataContext);
+    }
+
+    @Override
+    public CompiledQuery compile() {
+        return _dataContext.compileQuery(_query);
+    }
+
+    @Override
+    public DataSet execute() {
+        return _dataContext.executeQuery(_query);
+    }
+
+    @Override
+    public String toString() {
+        return "DefaultInvokableQuery[" + _query + "]";
+    }
+}
diff --git a/core/src/main/java/org/apache/metamodel/query/InvokableQuery.java b/core/src/main/java/org/apache/metamodel/query/InvokableQuery.java
new file mode 100644 (file)
index 0000000..d7770ff
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.query;
+
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.data.DataSet;
+
+/**
+ * Represents a {@link Query} or query-builder object that's aware of it's {@link DataContext} and is ready to execute
+ * or compile.
+ */
+public interface InvokableQuery {
+
+    /**
+     * Compiles the query
+     * 
+     * @return the {@link CompiledQuery} that is is returned by compiling the query.
+     */
+    public CompiledQuery compile();
+
+    /**
+     * Executes the query.
+     * 
+     * @return the {@link DataSet} that is returned by executing the query.
+     */
+    public DataSet execute();
+}
index bbb9c5b..7dc9278 100644 (file)
@@ -569,6 +569,10 @@ public final class Query extends BaseObject implements Cloneable, Serializable {
     public Integer getFirstRow() {
         return _firstRow;
     }
+    
+    public InvokableQuery invokable(DataContext dataContext) {
+        return new DefaultInvokableQuery(this, dataContext);
+    }
 
     @Override
     protected void decorateIdentity(List<Object> identifiers) {
index f94ebdb..f425221 100644 (file)
  */
 package org.apache.metamodel.query.builder;
 
-import org.apache.metamodel.DataContext;
-import org.apache.metamodel.data.DataSet;
-import org.apache.metamodel.query.CompiledQuery;
 import org.apache.metamodel.query.FilterItem;
 import org.apache.metamodel.query.FunctionType;
 import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.InvokableQuery;
 import org.apache.metamodel.query.ScalarFunction;
 import org.apache.metamodel.schema.Column;
 
@@ -33,7 +31,7 @@ import org.apache.metamodel.schema.Column;
  * 
  * @param <B>
  */
-public interface SatisfiedQueryBuilder<B extends SatisfiedQueryBuilder<?>> {
+public interface SatisfiedQueryBuilder<B extends SatisfiedQueryBuilder<?>> extends InvokableQuery {
 
     public ColumnSelectBuilder<B> select(Column column);
 
@@ -119,16 +117,6 @@ public interface SatisfiedQueryBuilder<B extends SatisfiedQueryBuilder<?>> {
      */
     public Query toQuery();
 
-    public CompiledQuery compile();
-
-    /**
-     * Executes the built query. This call is similar to calling
-     * {@link #toQuery()} and then {@link DataContext#executeQuery(Query)}.
-     * 
-     * @return the {@link DataSet} that is returned by executing the query.
-     */
-    public DataSet execute();
-
     /**
      * Finds a column by name within the already defined FROM items
      * 
index 7ca4bf9..44178b2 100644 (file)
@@ -53,7 +53,7 @@ public class UnionDataSetTest {
 
         final DataSetHeader unionHeader =
                 new SimpleDataSetHeader(new Column[] { new MutableColumn("fooUnion"), new MutableColumn("barUnion") });
-        final DataSet unionDataSet = new UnionDataSet(unionHeader, Arrays.asList(ds1, ds2, ds3));
+        final DataSet unionDataSet = UnionDataSet.ofDataSets(unionHeader, Arrays.asList(ds1, ds2, ds3));
         assertTrue(unionDataSet.next());
         assertEquals("Row[values=[1, 2]]", unionDataSet.getRow().toString());
         assertTrue(unionDataSet.next());