Repository: drill
Updated Branches:
  refs/heads/master 29e054769 -> 3036d3700


http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/schema/OpenTSDBSchemaFactory.java
----------------------------------------------------------------------
diff --git 
a/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/schema/OpenTSDBSchemaFactory.java
 
b/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/schema/OpenTSDBSchemaFactory.java
new file mode 100644
index 0000000..cca39d8
--- /dev/null
+++ 
b/contrib/storage-opentsdb/src/main/java/org/apache/drill/exec/store/openTSDB/schema/OpenTSDBSchemaFactory.java
@@ -0,0 +1,77 @@
+/*
+ * 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.drill.exec.store.openTSDB.schema;
+
+import org.apache.calcite.schema.SchemaPlus;
+import org.apache.calcite.schema.Table;
+import org.apache.drill.exec.store.AbstractSchema;
+import org.apache.drill.exec.store.SchemaConfig;
+import org.apache.drill.exec.store.SchemaFactory;
+import org.apache.drill.exec.store.openTSDB.DrillOpenTSDBTable;
+import org.apache.drill.exec.store.openTSDB.OpenTSDBScanSpec;
+import org.apache.drill.exec.store.openTSDB.OpenTSDBStoragePlugin;
+import org.apache.drill.exec.store.openTSDB.OpenTSDBStoragePluginConfig;
+import org.apache.drill.exec.store.openTSDB.client.Schema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+
+public class OpenTSDBSchemaFactory implements SchemaFactory {
+
+  private static final Logger log = 
LoggerFactory.getLogger(OpenTSDBSchemaFactory.class);
+
+  private final String schemaName;
+  private final OpenTSDBStoragePlugin plugin;
+
+  public OpenTSDBSchemaFactory(OpenTSDBStoragePlugin plugin, String 
schemaName) {
+    this.plugin = plugin;
+    this.schemaName = schemaName;
+  }
+
+  @Override
+  public void registerSchemas(SchemaConfig schemaConfig, SchemaPlus parent) 
throws IOException {
+    OpenTSDBSchema schema = new OpenTSDBSchema(schemaName);
+    parent.add(schemaName, schema);
+  }
+
+  class OpenTSDBSchema extends AbstractSchema {
+
+    OpenTSDBSchema(String name) {
+      super(Collections.<String>emptyList(), name);
+    }
+
+    @Override
+    public Table getTable(String name) {
+      OpenTSDBScanSpec scanSpec = new OpenTSDBScanSpec(name);
+        return new DrillOpenTSDBTable(schemaName, plugin, new 
Schema(plugin.getClient(), name), scanSpec);
+    }
+
+    @Override
+    public Set<String> getTableNames() {
+      return plugin.getClient().getAllMetricNames();
+    }
+
+    @Override
+    public String getTypeName() {
+      return OpenTSDBStoragePluginConfig.NAME;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/contrib/storage-opentsdb/src/main/resources/bootstrap-storage-plugins.json
----------------------------------------------------------------------
diff --git 
a/contrib/storage-opentsdb/src/main/resources/bootstrap-storage-plugins.json 
b/contrib/storage-opentsdb/src/main/resources/bootstrap-storage-plugins.json
new file mode 100644
index 0000000..d1055c1
--- /dev/null
+++ b/contrib/storage-opentsdb/src/main/resources/bootstrap-storage-plugins.json
@@ -0,0 +1,9 @@
+{
+  "storage": {
+    openTSDB: {
+      type: "openTSDB",
+      connection: "http://localhost:10000";,
+      enabled: false
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/contrib/storage-opentsdb/src/main/resources/drill-module.conf
----------------------------------------------------------------------
diff --git a/contrib/storage-opentsdb/src/main/resources/drill-module.conf 
b/contrib/storage-opentsdb/src/main/resources/drill-module.conf
new file mode 100644
index 0000000..d5743da
--- /dev/null
+++ b/contrib/storage-opentsdb/src/main/resources/drill-module.conf
@@ -0,0 +1,21 @@
+// 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.
+//
+//  This file tells Drill to consider this module when class path scanning.
+//  This file can also include any supplementary configuration information.
+//  This file is in HOCON format, see 
https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
+drill.classpath.scanning: {
+  packages += "org.apache.drill.exec.store.openTSDB"
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestDataHolder.java
----------------------------------------------------------------------
diff --git 
a/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestDataHolder.java
 
b/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestDataHolder.java
new file mode 100644
index 0000000..c6e7228
--- /dev/null
+++ 
b/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestDataHolder.java
@@ -0,0 +1,247 @@
+/*
+ * 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.drill.store.openTSDB;
+
+public class TestDataHolder {
+
+  public static final String SAMPLE_DATA_FOR_POST_REQUEST_WITH_TAGS = "[{" +
+      "\"metric\":\"warp.speed.test\"," +
+      "\"tags\":{\"symbol\":\"VOD.L\"}," +
+      "\"aggregateTags\":[]," +
+      "\"dps\":{" +
+      "\"1407165399\":196.3000030517578," +
+      "\"1407165402\":196.3000030517578," +
+      "\"1407165405\":196.3000030517578," +
+      "\"1407165407\":196.3000030517578," +
+      "\"1407165410\":196.3000030517578," +
+      "\"1407165422\":196.3000030517578," +
+      "\"1488271956\":111.11000061035156}}," +
+      "{\"metric\":\"warp.speed.test\"," +
+      "\"tags\":{\"symbol\":\"BP.L\"}," +
+      "\"aggregateTags\":[]," +
+      "\"dps\":{" +
+      "\"1407165399\":484.20001220703125," +
+      "\"1407165403\":484.1499938964844," +
+      "\"1407165405\":484.1499938964844," +
+      "\"1407165408\":484.1499938964844," +
+      "\"1407165419\":484.1499938964844," +
+      "\"1407165423\":484.2550048828125}}," +
+      "{\"metric\":\"warp.speed.test\"," +
+      "\"tags\":{\"symbol\":\"BARC.L\"}," +
+      "\"aggregateTags\":[]," +
+      "\"dps\":{" +
+      "\"1407165401\":224.14999389648438," +
+      "\"1407165404\":224.14999389648438," +
+      "\"1407165406\":224.14999389648438," +
+      "\"1407165409\":224.14999389648438," +
+      "\"1407165422\":224.14999389648438}" +
+      "}]";
+
+  public static final String SAMPLE_DATA_FOR_GET_TABLE_REQUEST =
+      "[{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{}," +
+          "\"aggregateTags\":[\"symbol\"]," +
+          "\"dps\":{" +
+          "\"1407165399\":680.5000152587891," +
+          "\"1407165401\":904.625," +
+          "\"1407165402\":904.6124954223633," +
+          "\"1407165403\":904.5999908447266," +
+          "\"1407165404\":904.5999908447266," +
+          "\"1407165405\":904.5999908447266," +
+          "\"1407165406\":904.5999908447266," +
+          "\"1407165407\":904.5999908447266," +
+          "\"1407165408\":904.5999908447266," +
+          "\"1407165409\":904.5999908447266," +
+          "\"1407165410\":904.5999908447266," +
+          "\"1407165419\":904.5999908447266," +
+          "\"1407165422\":904.6787490844727," +
+          "\"1407165423\":680.5550068842233," +
+          "\"1488271956\":111.11000061035156}" +
+          "}]";
+
+  public static final String SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITH_TAGS 
=
+      "[{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{\"symbol\":\"VOD.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1261440000\":196.3000030517578," +
+          "\"1419120000\":111.11000061035156}" +
+          "},{" +
+          "\"metric\":\"warp.speed.test\"" +
+          ",\"tags\":{\"symbol\":\"BP.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1261440000\":484.1758321126302}" +
+          "},{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{" +
+          "\"symbol\":\"BARC.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1261440000\":224.14999389648438}" +
+          "}]";
+
+  public static final String SAMPLE_DATA_FOR_GET_TABLE_NAME_REQUEST = 
"[\"warp.speed.test\"]";
+
+  public static final String 
SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITHOUT_TAGS =
+      "[{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{}," +
+          "\"aggregateTags\":[" +
+          "\"symbol\"]," +
+          "\"dps\":{" +
+          "\"1261440000\":904.6258290608723," +
+          "\"1419120000\":111.11000061035156}" +
+          "}]";
+
+  public static final String SAMPLE_DATA_FOR_POST_END_REQUEST_WITHOUT_TAGS =
+      "[{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{}," +
+          "\"aggregateTags\":[" +
+          "\"symbol\"]," +
+          "\"dps\":{" +
+          "\"1407165399\":680.5000152587891," +
+          "\"1407165401\":904.625," +
+          "\"1407165402\":904.6124954223633," +
+          "\"1419120000\":904.5999908447266}" +
+          "}]";
+
+  public static final String DOWNSAMPLE_REQUEST_WTIHOUT_TAGS =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":null," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":\"5y-avg\"," +
+          "\"tags\":{}" +
+          "}]" +
+          "}";
+
+  public static final String END_PARAM_REQUEST_WTIHOUT_TAGS =
+        "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":\"1407165403000\"," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":null," +
+          "\"tags\":{}" +
+          "}]" +
+          "}";
+
+
+  public static final String DOWNSAMPLE_REQUEST_WITH_TAGS =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":null," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":\"5y-avg\"," +
+          "\"tags\":{" +
+          "\"symbol\":\"*\"}" +
+          "}]" +
+          "}";
+
+  public static final String END_PARAM_REQUEST_WITH_TAGS =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":\"1407165403000\"," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":null," +
+          "\"tags\":{" +
+          "\"symbol\":\"*\"}" +
+          "}]" +
+          "}";
+
+  public static final String REQUEST_TO_NONEXISTENT_METRIC =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":null," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.spee\"," +
+          "\"rate\":null," +
+          "\"downsample\":null," +
+          "\"tags\":{" + "}" +
+          "}]" +
+          "}";
+
+
+  public static final String POST_REQUEST_WITHOUT_TAGS =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":null," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":null," +
+          "\"tags\":{}" +
+          "}]" +
+          "}";
+
+
+  public static final String POST_REQUEST_WITH_TAGS =
+      "{" +
+          "\"start\":\"47y-ago\"," +
+          "\"end\":null," +
+          "\"queries\":[{" +
+          "\"aggregator\":\"sum\"," +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"rate\":null," +
+          "\"downsample\":null," +
+          "\"tags\":{" +
+          "\"symbol\":\"*\"}" +
+          "}]" +
+          "}";
+
+  public static final String SAMPLE_DATA_FOR_POST_END_REQUEST_WITH_TAGS =
+      "[{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{\"symbol\":\"VOD.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1407165399\":196.3000030517578," +
+          "\"1407165402\":196.3000030517578}" +
+          "},{" +
+          "\"metric\":\"warp.speed.test\"" +
+          ",\"tags\":{\"symbol\":\"BP.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1407165399\":484.20001220703125," +
+          "\"1407165403\":484.1499938964844}" +
+          "},{" +
+          "\"metric\":\"warp.speed.test\"," +
+          "\"tags\":{" +
+          "\"symbol\":\"BARC.L\"}," +
+          "\"aggregateTags\":[]," +
+          "\"dps\":{" +
+          "\"1407165401\":224.14999389648438}" +
+          "}]";
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestOpenTSDBPlugin.java
----------------------------------------------------------------------
diff --git 
a/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestOpenTSDBPlugin.java
 
b/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestOpenTSDBPlugin.java
new file mode 100644
index 0000000..2d6c506
--- /dev/null
+++ 
b/contrib/storage-opentsdb/src/test/java/org/apache/drill/store/openTSDB/TestOpenTSDBPlugin.java
@@ -0,0 +1,189 @@
+/*
+ * 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.drill.store.openTSDB;
+
+import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import org.apache.drill.PlanTestBase;
+import org.apache.drill.common.exceptions.UserRemoteException;
+import org.apache.drill.exec.store.StoragePluginRegistry;
+import org.apache.drill.exec.store.openTSDB.OpenTSDBStoragePlugin;
+import org.apache.drill.exec.store.openTSDB.OpenTSDBStoragePluginConfig;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.DOWNSAMPLE_REQUEST_WITH_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.DOWNSAMPLE_REQUEST_WTIHOUT_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.END_PARAM_REQUEST_WITH_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.END_PARAM_REQUEST_WTIHOUT_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.POST_REQUEST_WITHOUT_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.POST_REQUEST_WITH_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.REQUEST_TO_NONEXISTENT_METRIC;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_GET_TABLE_NAME_REQUEST;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_GET_TABLE_REQUEST;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITHOUT_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITH_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_POST_END_REQUEST_WITHOUT_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_POST_END_REQUEST_WITH_TAGS;
+import static 
org.apache.drill.store.openTSDB.TestDataHolder.SAMPLE_DATA_FOR_POST_REQUEST_WITH_TAGS;
+
+public class TestOpenTSDBPlugin extends PlanTestBase {
+
+  protected static OpenTSDBStoragePlugin storagePlugin;
+  protected static OpenTSDBStoragePluginConfig storagePluginConfig;
+
+  @Rule
+  public WireMockRule wireMockRule = new WireMockRule(10000);
+
+  @BeforeClass
+  public static void setup() throws Exception {
+    final StoragePluginRegistry pluginRegistry = 
getDrillbitContext().getStorage();
+    storagePlugin = (OpenTSDBStoragePlugin) 
pluginRegistry.getPlugin(OpenTSDBStoragePluginConfig.NAME);
+    storagePluginConfig = storagePlugin.getConfig();
+    storagePluginConfig.setEnabled(true);
+    pluginRegistry.createOrUpdate(OpenTSDBStoragePluginConfig.NAME, 
storagePluginConfig, true);
+  }
+
+  @Before
+  public void init() {
+    setupPostStubs();
+    setupGetStubs();
+  }
+
+  private void setupGetStubs() {
+    wireMockRule.stubFor(get(urlEqualTo("/api/suggest?type=metrics&max=" + 
Integer.MAX_VALUE))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withHeader("Content-Type", "application/json")
+            .withBody(SAMPLE_DATA_FOR_GET_TABLE_NAME_REQUEST)));
+
+    
wireMockRule.stubFor(get(urlEqualTo("/api/query?start=47y-ago&m=sum:warp.speed.test"))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withBody(SAMPLE_DATA_FOR_GET_TABLE_REQUEST)
+        ));
+  }
+
+  private void setupPostStubs() {
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+        .withRequestBody(equalToJson(POST_REQUEST_WITHOUT_TAGS))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withHeader("Content-Type", "application/json")
+            .withBody(SAMPLE_DATA_FOR_GET_TABLE_REQUEST)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+        .withRequestBody(equalToJson(POST_REQUEST_WITH_TAGS))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withHeader("Content-Type", "application/json")
+            .withBody(SAMPLE_DATA_FOR_POST_REQUEST_WITH_TAGS)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+        .withRequestBody(equalToJson(DOWNSAMPLE_REQUEST_WTIHOUT_TAGS))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withHeader("Content-Type", "application/json")
+            .withBody(SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITHOUT_TAGS)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+            .withRequestBody(equalToJson(END_PARAM_REQUEST_WTIHOUT_TAGS))
+            .willReturn(aResponse()
+                    .withStatus(200)
+                    .withHeader("Content-Type", "application/json")
+                    .withBody(SAMPLE_DATA_FOR_POST_END_REQUEST_WITHOUT_TAGS)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+        .withRequestBody(equalToJson(DOWNSAMPLE_REQUEST_WITH_TAGS))
+        .willReturn(aResponse()
+            .withStatus(200)
+            .withHeader("Content-Type", "application/json")
+            .withBody(SAMPLE_DATA_FOR_POST_DOWNSAMPLE_REQUEST_WITH_TAGS)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+            .withRequestBody(equalToJson(END_PARAM_REQUEST_WITH_TAGS))
+            .willReturn(aResponse()
+                    .withStatus(200)
+                    .withHeader("Content-Type", "application/json")
+                    .withBody(SAMPLE_DATA_FOR_POST_END_REQUEST_WITH_TAGS)));
+
+    wireMockRule.stubFor(post(urlEqualTo("/api/query"))
+        .withRequestBody(equalToJson(REQUEST_TO_NONEXISTENT_METRIC))
+        .willReturn(aResponse()
+            .withStatus(400)
+            .withHeader("Content-Type", "application/json")
+        ));
+  }
+
+  @Test
+  public void testBasicQueryFromWithRequiredParams() throws Exception {
+    String query =
+            "select * from openTSDB.`(metric=warp.speed.test, start=47y-ago, 
aggregator=sum)`";
+    Assert.assertEquals(18, testSql(query));
+  }
+
+  @Test
+  public void testBasicQueryGroupBy() throws Exception {
+    String query =
+            "select `timestamp`, sum(`aggregated value`) from 
openTSDB.`(metric=warp.speed.test, aggregator=sum, start=47y-ago)` group by 
`timestamp`";
+    Assert.assertEquals(15, testSql(query));
+  }
+
+  @Test
+  public void testBasicQueryFromWithInterpolationParam() throws Exception {
+    String query = "select * from openTSDB.`(metric=warp.speed.test, 
aggregator=sum, start=47y-ago, downsample=5y-avg)`";
+    Assert.assertEquals(4, testSql(query));
+  }
+
+  @Test
+  public void testBasicQueryFromWithEndParam() throws Exception {
+    String query = "select * from openTSDB.`(metric=warp.speed.test, 
aggregator=sum, start=47y-ago, end=1407165403000))`";
+    Assert.assertEquals(5, testSql(query));
+  }
+
+  @Test(expected = UserRemoteException.class)
+  public void testBasicQueryWithoutTableName() throws Exception {
+    test("select * from openTSDB.``;");
+  }
+
+  @Test(expected = UserRemoteException.class)
+  public void testBasicQueryWithNonExistentTableName() throws Exception {
+    test("select * from openTSDB.`warp.spee`");
+  }
+
+  @Test
+  public void testPhysicalPlanExecutionBasedOnQuery() throws Exception {
+    String query = "EXPLAIN PLAN for select * from 
openTSDB.`(metric=warp.speed.test, start=47y-ago, aggregator=sum)`";
+    String plan = getPlanInString(query, JSON_FORMAT);
+    Assert.assertEquals(18, testPhysical(plan));
+  }
+
+  @Test
+  public void testDescribe() throws Exception {
+    test("use openTSDB");
+    test("describe `warp.speed.test`");
+    Assert.assertEquals(1, testSql("show tables"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/496c97d1/distribution/pom.xml
----------------------------------------------------------------------
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 86c3d11..9bb21d6 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -223,6 +223,11 @@
         </dependency>
         <dependency>
           <groupId>org.apache.drill.contrib</groupId>
+          <artifactId>drill-opentsdb-storage</artifactId>
+          <version>${project.version}</version>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.drill.contrib</groupId>
           <artifactId>drill-mongo-storage</artifactId>
           <version>${project.version}</version>
         </dependency>

Reply via email to