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 2016/07/11 05:23:16 UTC
[05/16] metamodel git commit: METAMODEL-1088: Fixed #106
METAMODEL-1088: Fixed #106
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/dbc9b54e
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/dbc9b54e
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/dbc9b54e
Branch: refs/heads/feature/5.x/swagger-docs
Commit: dbc9b54e5546646ff7023ad5f8cccceaece54816
Parents: 35928e3
Author: Alberto Rodriguez <ar...@stratio.com>
Authored: Mon May 30 09:37:15 2016 +0200
Committer: Alberto Rodriguez <ar...@stratio.com>
Committed: Mon May 30 09:37:15 2016 +0200
----------------------------------------------------------------------
CHANGES.md | 5 ++
.../mongodb/mongo2/MongoDbDataContext.java | 45 +++++++++++++++---
.../mongodb/mongo2/MongoDbDataSet.java | 8 ++++
.../mongodb/mongo2/MongoDbDataContextTest.java | 35 ++++++++++++++
.../mongodb/mongo3/MongoDbDataContext.java | 48 +++++++++++++++++---
.../mongodb/mongo3/MongoDbDataSet.java | 8 ++++
.../mongodb/mongo3/MongoDbDataContextTest.java | 34 ++++++++++++++
7 files changed, 170 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 33f3a04..52f1323 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,8 @@
+### Apache MetaModel 4.5.4 (work in progress)
+
+ * [METAMODEL-1088] - Add support for aliases in MongoDB
+
+
### Apache MetaModel 4.5.3
* [METAMODEL-235] - Fixed a bug related to handling of null or missing values in ElasticSearch using REST client.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
index cfeb836..535c8f8 100644
--- a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
+++ b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
@@ -287,7 +287,9 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
// "SELECT [columns] FROM [table] WHERE [conditions]"
// query.
for (SelectItem selectItem : selectItems) {
- if (selectItem.getFunction() != null || selectItem.getColumn() == null) {
+ if (selectItem.getAggregateFunction() != null
+ || selectItem.getScalarFunction() != null
+ || selectItem.getColumn() == null) {
allSelectItemsAreColumns = false;
break;
}
@@ -325,10 +327,29 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
int firstRow = (query.getFirstRow() == null ? 1 : query.getFirstRow());
int maxRows = (query.getMaxRows() == null ? -1 : query.getMaxRows());
+ boolean thereIsAtLeastOneAlias = false;
- final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
- maxRows, false);
- return dataSet;
+ for (SelectItem selectItem : selectItems) {
+ if (selectItem.getAlias() != null) {
+ thereIsAtLeastOneAlias = true;
+ break;
+ }
+ }
+
+ if (thereIsAtLeastOneAlias) {
+ final SelectItem[] selectItemsAsArray = selectItems.toArray(new SelectItem[selectItems.size()]);
+ final DataSet dataSet = materializeMainSchemaTableInternal(
+ table,
+ selectItemsAsArray,
+ whereItems,
+ firstRow,
+ maxRows, false);
+ return dataSet;
+ } else {
+ final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
+ maxRows, false);
+ return dataSet;
+ }
}
}
}
@@ -339,6 +360,19 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
private DataSet materializeMainSchemaTableInternal(Table table, Column[] columns, List<FilterItem> whereItems,
int firstRow, int maxRows, boolean queryPostProcessed) {
+ DBCursor cursor = getCursor(table, whereItems, firstRow, maxRows);
+
+ return new MongoDbDataSet(cursor, columns, queryPostProcessed);
+ }
+
+ private DataSet materializeMainSchemaTableInternal(Table table, SelectItem[] selectItems,
+ List<FilterItem> whereItems, int firstRow, int maxRows, boolean queryPostProcessed) {
+ DBCursor cursor = getCursor(table, whereItems, firstRow, maxRows);
+
+ return new MongoDbDataSet(cursor, selectItems, queryPostProcessed);
+ }
+
+ private DBCursor getCursor(Table table, List<FilterItem> whereItems, int firstRow, int maxRows) {
final DBCollection collection = _mongoDb.getCollection(table.getName());
final DBObject query = createMongoDbQuery(table, whereItems);
@@ -353,8 +387,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
final int skip = firstRow - 1;
cursor = cursor.skip(skip);
}
-
- return new MongoDbDataSet(cursor, columns, queryPostProcessed);
+ return cursor;
}
protected BasicDBObject createMongoDbQuery(Table table, List<FilterItem> whereItems) {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
index 8c2a107..ea7cd9e 100644
--- a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
+++ b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.mongodb.mongo2;
import org.apache.metamodel.data.AbstractDataSet;
import org.apache.metamodel.data.Row;
import org.apache.metamodel.mongodb.common.MongoDBUtils;
+import org.apache.metamodel.query.SelectItem;
import org.apache.metamodel.schema.Column;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,6 +46,13 @@ final class MongoDbDataSet extends AbstractDataSet {
_closed = false;
}
+ public MongoDbDataSet(DBCursor cursor, SelectItem[] selectItems, boolean queryPostProcessed) {
+ super(selectItems);
+ _cursor = cursor;
+ _queryPostProcessed = queryPostProcessed;
+ _closed = false;
+ }
+
public boolean isQueryPostProcessed() {
return _queryPostProcessed;
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
index a03585a..da99955 100644
--- a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
+++ b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
@@ -632,4 +632,39 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
ds4.close();
}
}
+
+ public void testSelectWithAlias() throws Exception {
+ if (!isConfigured()) {
+ System.err.println(getInvalidConfigurationMessage());
+ return;
+ }
+
+ DBCollection col = db.createCollection(getCollectionName(), new BasicDBObject());
+
+ // delete if already exists
+ {
+ col.drop();
+ col = db.createCollection(getCollectionName(), new BasicDBObject());
+ }
+
+ final BasicDBObject dbRow = new BasicDBObject();
+ dbRow.append("name", new BasicDBObject().append("first", "John").append("last", "Doe"));
+ dbRow.append("gender", "MALE");
+ col.insert(dbRow);
+
+ final MongoDbDataContext dc = new MongoDbDataContext(db, new SimpleTableDef(getCollectionName(), new String[] {
+ "name.first", "name.last", "gender", "addresses", "addresses[0].city", "addresses[0].country",
+ "addresses[5].foobar" }));
+
+ final DataSet ds1 = dc.executeQuery("select gender AS my_gender, name.first AS my_name from my_collection where gender LIKE '%MALE%'");
+ final SelectItem[] selectItems = ds1.getSelectItems();
+ SelectItem firstSelectItem = selectItems[0];
+ SelectItem secondSelectItem = selectItems[1];
+ try {
+ assertNotNull(firstSelectItem.getAlias());
+ assertNotNull(secondSelectItem.getAlias());
+ } finally {
+ ds1.close();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
index fbc9047..3108964 100644
--- a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
+++ b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
@@ -275,7 +275,9 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
// "SELECT [columns] FROM [table] WHERE [conditions]"
// query.
for (SelectItem selectItem : selectItems) {
- if (selectItem.getFunction() != null || selectItem.getColumn() == null) {
+ if (selectItem.getAggregateFunction() != null
+ || selectItem.getScalarFunction() != null
+ || selectItem.getColumn() == null) {
allSelectItemsAreColumns = false;
break;
}
@@ -314,9 +316,29 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
int firstRow = (query.getFirstRow() == null ? 1 : query.getFirstRow());
int maxRows = (query.getMaxRows() == null ? -1 : query.getMaxRows());
- final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
- maxRows, false);
- return dataSet;
+ boolean thereIsAtLeastOneAlias = false;
+
+ for (SelectItem selectItem : selectItems) {
+ if (selectItem.getAlias() != null) {
+ thereIsAtLeastOneAlias = true;
+ break;
+ }
+ }
+
+ if (thereIsAtLeastOneAlias) {
+ final SelectItem[] selectItemsAsArray = selectItems.toArray(new SelectItem[selectItems.size()]);
+ final DataSet dataSet = materializeMainSchemaTableInternal(
+ table,
+ selectItemsAsArray,
+ whereItems,
+ firstRow,
+ maxRows, false);
+ return dataSet;
+ } else {
+ final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
+ maxRows, false);
+ return dataSet;
+ }
}
}
}
@@ -327,6 +349,20 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
private DataSet materializeMainSchemaTableInternal(Table table, Column[] columns, List<FilterItem> whereItems,
int firstRow, int maxRows, boolean queryPostProcessed) {
+ MongoCursor<Document> cursor = getDocumentMongoCursor(table, whereItems, firstRow, maxRows);
+
+ return new MongoDbDataSet(cursor, columns, queryPostProcessed);
+ }
+
+ private DataSet materializeMainSchemaTableInternal(Table table, SelectItem[] selectItems, List<FilterItem> whereItems,
+ int firstRow, int maxRows, boolean queryPostProcessed) {
+ MongoCursor<Document> cursor = getDocumentMongoCursor(table, whereItems, firstRow, maxRows);
+
+ return new MongoDbDataSet(cursor, selectItems, queryPostProcessed);
+ }
+
+ private MongoCursor<Document> getDocumentMongoCursor(Table table, List<FilterItem> whereItems, int firstRow,
+ int maxRows) {
final MongoCollection<Document> collection = _mongoDb.getCollection(table.getName());
final Document query = createMongoDbQuery(table, whereItems);
@@ -342,9 +378,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
iterable = iterable.skip(skip);
}
- MongoCursor<Document> cursor = iterable.iterator();
-
- return new MongoDbDataSet(cursor, columns, queryPostProcessed);
+ return iterable.iterator();
}
protected Document createMongoDbQuery(Table table, List<FilterItem> whereItems) {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
index 7a480d1..19e543f 100644
--- a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
+++ b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.mongodb.mongo3;
import org.apache.metamodel.data.AbstractDataSet;
import org.apache.metamodel.data.Row;
import org.apache.metamodel.mongodb.common.MongoDBUtils;
+import org.apache.metamodel.query.SelectItem;
import org.apache.metamodel.schema.Column;
import org.bson.Document;
import org.slf4j.Logger;
@@ -45,6 +46,13 @@ final class MongoDbDataSet extends AbstractDataSet {
_closed = false;
}
+ public MongoDbDataSet(MongoCursor<Document> cursor, SelectItem[] selectItems, boolean queryPostProcessed) {
+ super(selectItems);
+ _cursor = cursor;
+ _queryPostProcessed = queryPostProcessed;
+ _closed = false;
+ }
+
public boolean isQueryPostProcessed() {
return _queryPostProcessed;
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/dbc9b54e/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
index d16e47c..197fae9 100644
--- a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
+++ b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
@@ -24,6 +24,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
import com.mongodb.WriteConcern;
import org.apache.metamodel.DataContext;
@@ -610,4 +612,36 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
ds4.close();
}
}
+
+ public void testSelectWithAlias() throws Exception {
+ if (!isConfigured()) {
+ System.err.println(getInvalidConfigurationMessage());
+ return;
+ }
+
+ mongoDb.createCollection(getCollectionName());
+ MongoCollection<Document> col = mongoDb.getCollection(getCollectionName());
+
+ final Document dbRow = new Document();
+ dbRow.append("name", new Document().append("first", "John").append("last", "Doe"));
+ dbRow.append("gender", "MALE");
+ col.insertOne(dbRow);
+
+ final MongoDbDataContext dc = new MongoDbDataContext(mongoDb,
+ new SimpleTableDef(getCollectionName(), new String[] {
+ "name.first", "name.last", "gender", "addresses", "addresses[0].city", "addresses[0].country",
+ "addresses[5].foobar" }));
+
+ final DataSet ds1 = dc.executeQuery("select gender as my_gender, name.first as my_name from my_collection where gender LIKE '%MALE%'");
+ final SelectItem[] selectItems = ds1.getSelectItems();
+ SelectItem firstSelectItem = selectItems[0];
+ SelectItem secondSelectItem = selectItems[1];
+ try {
+ assertNotNull(firstSelectItem.getAlias());
+ assertNotNull(secondSelectItem.getAlias());
+
+ } finally {
+ ds1.close();
+ }
+ }
}