Repository: metamodel
Updated Branches:
  refs/heads/master 76f6bb7b1 -> 2a76db6ee


METAMODEL-140: Fixed
Fixes #24
Fixes #23

Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/2a76db6e
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/2a76db6e
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/2a76db6e

Branch: refs/heads/master
Commit: 2a76db6eeedfcd99bb6a117860aeae15f126902d
Parents: 76f6bb7
Author: maphysics <[email protected]>
Authored: Wed May 20 23:06:13 2015 +0200
Committer: Kasper Sørensen <[email protected]>
Committed: Wed May 20 23:06:13 2015 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |  3 +-
 .../elasticsearch/ElasticSearchDataContext.java | 16 +++++++--
 .../ElasticSearchMetaDataParser.java            | 22 +++++++-----
 .../ElasticSearchDataContextTest.java           | 36 ++++++++++++++++++++
 4 files changed, 64 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/2a76db6e/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 4b9acda..5951469 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,10 +1,11 @@
 ### Work-in-progress
 
  * [METAMODEL-136] - Added LIKE operator native support (using conversion to 
regex) for MongoDB.
- * [METAMODEL-138] - Allow empty characteres before AS keyword.
+ * [METAMODEL-138] - Allow empty characters before AS keyword in query parsing.
  * [METAMODEL-141] - Improved mapping of ColumnType to SQL data types for 
Oracle, SQL Server, MySQL, DB2 and PostgreSQL
  * [METAMODEL-142] - Ensured that JDBC schema refreshes in an UpdateScript is 
using same Connection/Transaction as rest of operations
  * [METAMODEL-133] - Improved query parser support for multiple JOINs in same 
query.
+ * [METAMODEL-140] - Fixed support for ElasticSearch mappings with additional 
property attributes.
 
 ### Apache MetaModel 4.3.3
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2a76db6e/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContext.java
----------------------------------------------------------------------
diff --git 
a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContext.java
 
b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContext.java
index c2d7f1b..ce028f6 100644
--- 
a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContext.java
+++ 
b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContext.java
@@ -229,9 +229,19 @@ public class ElasticSearchDataContext extends 
QueryPostprocessDataContext implem
         }
         final Map<String, Object> mp = mappingMetaData.getSourceAsMap();
         final Iterator<Map.Entry<String, Object>> it = 
mp.entrySet().iterator();
-        final Map.Entry<String, Object> pair = it.next();
-        final ElasticSearchMetaData metaData = 
ElasticSearchMetaDataParser.parse(pair.getValue());
-        return new SimpleTableDef(documentType, metaData.getColumnNames(), 
metaData.getColumnTypes());
+        SimpleTableDef std = null;
+        while (it.hasNext()) {
+            final Map.Entry<String, Object> pair = it.next();
+            if (pair.getKey().equals("properties")) {
+                final ElasticSearchMetaData metaData = 
ElasticSearchMetaDataParser.parse(pair.getValue());
+                std = new SimpleTableDef(documentType, 
metaData.getColumnNames(), metaData.getColumnTypes());
+            }
+        }
+        if (std == null) {
+            throw new IllegalArgumentException("No properties defined for 
document type '" + documentType
+                    + "' in index: " + indexName);
+        }
+        return std;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2a76db6e/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchMetaDataParser.java
----------------------------------------------------------------------
diff --git 
a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchMetaDataParser.java
 
b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchMetaDataParser.java
index fdab722..82953d1 100644
--- 
a/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchMetaDataParser.java
+++ 
b/elasticsearch/src/main/java/org/apache/metamodel/elasticsearch/ElasticSearchMetaDataParser.java
@@ -25,7 +25,7 @@ import org.apache.metamodel.schema.ColumnType;
  * into an ElasticSearchMetaData object.
  */
 public class ElasticSearchMetaDataParser {
-    
+
     /**
      * Parses the ElasticSearch meta data info into an ElasticSearchMetaData
      * object. This method makes much easier to create the ElasticSearch 
schema.
@@ -37,15 +37,15 @@ public class ElasticSearchMetaDataParser {
     public static ElasticSearchMetaData parse(Object metaDataInfo) {
         final String plainMetaDataInfo = 
removeFirstAndLastCharacter(metaDataInfo.toString());
         final String metaDataWithoutDateFormats = 
removeDateFormats(plainMetaDataInfo);
-        final String[] metaDataFields = metaDataWithoutDateFormats.split(",");
-        
+        final String[] metaDataFields = metaDataWithoutDateFormats.split("},");
+
         final String[] fieldNames = new String[metaDataFields.length + 1];
         final ColumnType[] columnTypes = new ColumnType[metaDataFields.length 
+ 1];
-        
+
         // add the document ID field (fixed)
         fieldNames[0] = ElasticSearchDataContext.FIELD_ID;
         columnTypes[0] = ColumnType.STRING;
-        
+
         int i = 1;
         for (String metaDataField : metaDataFields) {
             // message={type=long}
@@ -91,10 +91,14 @@ public class ElasticSearchMetaDataParser {
     }
 
     private static String getMetaDataFieldTypeFromMetaDataField(String 
metaDataField) {
-        final String metaDataFieldWithoutName = 
metaDataField.substring(metaDataField.indexOf("=") + 1);
-        final String metaDataFieldType = 
metaDataFieldWithoutName.substring(metaDataFieldWithoutName.indexOf("=") + 1,
-                metaDataFieldWithoutName.length() - 1);
-        return metaDataFieldType;
+        String type = metaDataField.substring(metaDataField.indexOf("type=") + 
5);
+        if (type.indexOf(",") > 0) {
+            type = type.substring(0, type.indexOf(","));
+        }
+        if (type.indexOf("}") > 0) {
+            type = type.substring(0, type.indexOf("}"));
+        }
+        return type;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2a76db6e/elasticsearch/src/test/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContextTest.java
----------------------------------------------------------------------
diff --git 
a/elasticsearch/src/test/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContextTest.java
 
b/elasticsearch/src/test/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContextTest.java
index 0c48391..07c6181 100644
--- 
a/elasticsearch/src/test/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContextTest.java
+++ 
b/elasticsearch/src/test/java/org/apache/metamodel/elasticsearch/ElasticSearchDataContextTest.java
@@ -49,6 +49,11 @@ import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.update.Update;
+import org.elasticsearch.Version;
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
+import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
+import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
+import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
 import org.elasticsearch.action.bulk.BulkRequestBuilder;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -62,8 +67,11 @@ public class ElasticSearchDataContextTest {
     private static final String indexName = "twitter";
     private static final String indexType1 = "tweet1";
     private static final String indexType2 = "tweet2";
+    private static final String indexName2 = "twitter2";
+    private static final String indexType3 = "tweet3";
     private static final String bulkIndexType = "bulktype";
     private static final String peopleIndexType = "peopletype";
+    private static final String mapping = 
"{\"date_detection\":\"false\",\"properties\":{\"message\":{\"type\":\"string\",\"index\":\"not_analyzed\",\"doc_values\":\"true\"}}}";
     private static EmbeddedElasticsearchServer embeddedElasticsearchServer;
     private static Client client;
     private static UpdateableDataContext dataContext;
@@ -515,6 +523,34 @@ public class ElasticSearchDataContextTest {
         assertTrue(thrown);
     }
 
+    @Test
+    public void testNonDynamicMapingTableNames() throws Exception {
+        if (Version.CURRENT.major == 0) {
+            // this test is omitted on v. 0.x versions of ElasticSearch since
+            // the put mapping API is incompatible with 1.x so we cannot create
+            // the same prerequisites in the test.
+            return;
+        }
+
+        createIndex();
+
+        ElasticSearchDataContext dataContext2 = new 
ElasticSearchDataContext(client, indexName2);
+
+        assertEquals("[tweet3]", 
Arrays.toString(dataContext2.getDefaultSchema().getTableNames()));
+    }
+
+    private static void createIndex() {
+        CreateIndexRequest cir = new CreateIndexRequest(indexName2);
+        CreateIndexResponse response = 
client.admin().indices().create(cir).actionGet();
+
+        System.out.println("create index: " + response.isAcknowledged());
+
+        PutMappingRequest pmr = new 
PutMappingRequest(indexName2).type(indexType3).source(mapping);
+
+        PutMappingResponse response2 = 
client.admin().indices().putMapping(pmr).actionGet();
+        System.out.println("put mapping: " + response2.isAcknowledged());
+    }
+
     private static void indexBulkDocuments(String indexName, String indexType, 
int numberOfDocuments) {
         BulkRequestBuilder bulkRequest = client.prepareBulk();
 

Reply via email to