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.am.kasper.soren...@gmail.com> Authored: Wed Jun 7 21:39:27 2017 -0700 Committer: Kasper Sørensen <i.am.kasper.soren...@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());