You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2017/07/22 16:57:45 UTC
[30/33] metamodel git commit: METAMODEL-63: Slight redesign to
introduce building block InvokableQuery
METAMODEL-63: Slight redesign to introduce building block InvokableQuery
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/78d85d6d
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/78d85d6d
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/78d85d6d
Branch: refs/heads/master
Commit: 78d85d6d322590adf66b37c75c28f43703f73933
Parents: fe80412
Author: Kasper Sørensen <i....@gmail.com>
Authored: Wed Jun 7 21:39:27 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Wed Jun 7 21:39:27 2017 -0700
----------------------------------------------------------------------
CHANGES.md | 2 +-
.../apache/metamodel/data/AbstractDataSet.java | 3 +-
.../org/apache/metamodel/data/UnionDataSet.java | 26 +++++++---
.../metamodel/query/DefaultInvokableQuery.java | 53 ++++++++++++++++++++
.../apache/metamodel/query/InvokableQuery.java | 43 ++++++++++++++++
.../java/org/apache/metamodel/query/Query.java | 4 ++
.../query/builder/SatisfiedQueryBuilder.java | 16 +-----
.../apache/metamodel/data/UnionDataSetTest.java | 2 +-
8 files changed, 126 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 1da125a..b2cb95b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -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.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
index cd46591..f616ddc 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
@@ -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) {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
index 1391428..7962f56 100644
--- a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
@@ -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;
+ }
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/query/DefaultInvokableQuery.java
----------------------------------------------------------------------
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
index 0000000..368ce2b
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/query/DefaultInvokableQuery.java
@@ -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 + "]";
+ }
+}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/query/InvokableQuery.java
----------------------------------------------------------------------
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
index 0000000..d7770ff
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/query/InvokableQuery.java
@@ -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();
+}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/query/Query.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/Query.java b/core/src/main/java/org/apache/metamodel/query/Query.java
index bbb9c5b..7dc9278 100644
--- a/core/src/main/java/org/apache/metamodel/query/Query.java
+++ b/core/src/main/java/org/apache/metamodel/query/Query.java
@@ -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) {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java
index f94ebdb..f425221 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedQueryBuilder.java
@@ -18,12 +18,10 @@
*/
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
*
http://git-wip-us.apache.org/repos/asf/metamodel/blob/78d85d6d/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
index 7ca4bf9..44178b2 100644
--- a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
@@ -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());