Repository: metamodel Updated Branches: refs/heads/5.x b7816ff62 -> 78d85d6d3
METAMODEL-63: Added UnionDataSet Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/fe804127 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/fe804127 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/fe804127 Branch: refs/heads/5.x Commit: fe80412708e0bcd5e244e9e8f8b0d17ef05fcab4 Parents: b7816ff Author: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Authored: Wed Jun 7 21:12:27 2017 -0700 Committer: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Committed: Wed Jun 7 21:12:27 2017 -0700 ---------------------------------------------------------------------- CHANGES.md | 1 + .../org/apache/metamodel/MetaModelHelper.java | 2 - .../org/apache/metamodel/data/UnionDataSet.java | 73 ++++++++++++++++++++ .../apache/metamodel/data/UnionDataSetTest.java | 68 ++++++++++++++++++ 4 files changed, 142 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/fe804127/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 0c5b76c..1da125a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +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-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/fe804127/core/src/main/java/org/apache/metamodel/MetaModelHelper.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java index ab38a96..09d47bc 100644 --- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java +++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java @@ -19,7 +19,6 @@ package org.apache.metamodel; import java.util.ArrayList; - import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -46,7 +45,6 @@ import org.apache.metamodel.data.SimpleDataSetHeader; import org.apache.metamodel.data.SubSelectionDataSet; import org.apache.metamodel.query.FilterItem; import org.apache.metamodel.query.FromItem; -import org.apache.metamodel.query.FunctionType; import org.apache.metamodel.query.GroupByItem; import org.apache.metamodel.query.OrderByItem; import org.apache.metamodel.query.Query; http://git-wip-us.apache.org/repos/asf/metamodel/blob/fe804127/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 new file mode 100644 index 0000000..1391428 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java @@ -0,0 +1,73 @@ +/** + * 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.data; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Objects; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +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 { + + 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 UnionDataSet(DataSetHeader header, Iterable<Supplier<DataSet>> dataSetProviders) { + super(header); + Objects.nonNull(dataSetProviders); + _dataSetProviders = dataSetProviders; + } + + @Override + public boolean next() { + if (_iterator == null) { + _iterator = _dataSetProviders.iterator(); + } + + while (_currentDataSet == null || !_currentDataSet.next()) { + if (!_iterator.hasNext()) { + _currentDataSet = null; + return false; + } + _currentDataSet = _iterator.next().get(); + assert getHeader().size() == _currentDataSet.getSelectItems().length; + } + return true; + } + + @Override + public Row getRow() { + if (_currentDataSet == null) { + return null; + } + return _currentDataSet.getRow(); + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/fe804127/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 new file mode 100644 index 0000000..7ca4bf9 --- /dev/null +++ b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java @@ -0,0 +1,68 @@ +/** + * 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.data; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; + +import org.apache.metamodel.schema.Column; +import org.apache.metamodel.schema.MutableColumn; +import org.junit.Test; + +public class UnionDataSetTest { + + @Test + public void testVanillaUnion() { + // data set 1 + final DataSetHeader header1 = + new SimpleDataSetHeader(new Column[] { new MutableColumn("foo1"), new MutableColumn("bar1") }); + final Row row1 = new DefaultRow(header1, new Object[] { "1", "2" }); + final Row row2 = new DefaultRow(header1, new Object[] { "3", "4" }); + final DataSet ds1 = new InMemoryDataSet(header1, row1, row2); + + // data set 2 + final DataSetHeader header2 = + new SimpleDataSetHeader(new Column[] { new MutableColumn("foo2"), new MutableColumn("bar2") }); + final Row row3 = new DefaultRow(header2, new Object[] { "5", "6" }); + final DataSet ds2 = new InMemoryDataSet(header2, row3); + + // data set 3 + final DataSetHeader header3 = + new SimpleDataSetHeader(new Column[] { new MutableColumn("foo3"), new MutableColumn("bar3") }); + final Row row4 = new DefaultRow(header2, new Object[] { "7", "8" }); + final DataSet ds3 = new InMemoryDataSet(header3, row4); + + final DataSetHeader unionHeader = + new SimpleDataSetHeader(new Column[] { new MutableColumn("fooUnion"), new MutableColumn("barUnion") }); + final DataSet unionDataSet = new UnionDataSet(unionHeader, Arrays.asList(ds1, ds2, ds3)); + assertTrue(unionDataSet.next()); + assertEquals("Row[values=[1, 2]]", unionDataSet.getRow().toString()); + assertTrue(unionDataSet.next()); + assertEquals("Row[values=[3, 4]]", unionDataSet.getRow().toString()); + assertTrue(unionDataSet.next()); + assertEquals("Row[values=[5, 6]]", unionDataSet.getRow().toString()); + assertTrue(unionDataSet.next()); + assertEquals("Row[values=[7, 8]]", unionDataSet.getRow().toString()); + assertFalse(unionDataSet.next()); + unionDataSet.close(); + } +}