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();
