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:44 UTC
[29/33] metamodel git commit: METAMODEL-63: Added UnionDataSet
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/master
Commit: fe80412708e0bcd5e244e9e8f8b0d17ef05fcab4
Parents: b7816ff
Author: Kasper Sørensen <i....@gmail.com>
Authored: Wed Jun 7 21:12:27 2017 -0700
Committer: Kasper Sørensen <i....@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();
+ }
+}