You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by jo...@apache.org on 2022/07/29 13:30:40 UTC
[zeppelin] branch master updated: Remove geode interpreter (#4430)
This is an automated email from the ASF dual-hosted git repository.
jongyoul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push:
new 83e672f0c7 Remove geode interpreter (#4430)
83e672f0c7 is described below
commit 83e672f0c7d0ee7d6c9a4935eee42ce1924beeb1
Author: Nelljun <34...@users.noreply.github.com>
AuthorDate: Fri Jul 29 22:30:30 2022 +0900
Remove geode interpreter (#4430)
---
.github/workflows/core.yml | 2 +-
.github/workflows/frontend.yml | 2 +-
conf/interpreter-list | 1 -
dev/create_release.sh | 2 +-
docs/_includes/themes/zeppelin/_navigation.html | 1 -
docs/index.md | 1 -
docs/interpreter/geode.md | 218 ---------------
docs/usage/interpreter/installation.md | 5 -
geode/pom.xml | 80 ------
.../apache/zeppelin/geode/GeodeOqlInterpreter.java | 301 ---------------------
geode/src/main/resources/interpreter-setting.json | 33 ---
.../zeppelin/geode/GeodeOqlInterpreterTest.java | 178 ------------
pom.xml | 1 -
13 files changed, 3 insertions(+), 822 deletions(-)
diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
index 4f7b609f89..93366a5531 100644
--- a/.github/workflows/core.yml
+++ b/.github/workflows/core.yml
@@ -82,7 +82,7 @@ jobs:
interpreter-test-non-core:
runs-on: ubuntu-20.04
env:
- INTERPRETERS: 'beam,hbase,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,livy,groovy,sap,java,geode,neo4j,submarine,sparql,mongodb,influxdb,ksql'
+ INTERPRETERS: 'beam,hbase,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,livy,groovy,sap,java,neo4j,submarine,sparql,mongodb,influxdb,ksql'
steps:
- name: Checkout
uses: actions/checkout@v2
diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml
index defee2faa5..9ad2bf5045 100644
--- a/.github/workflows/frontend.yml
+++ b/.github/workflows/frontend.yml
@@ -19,7 +19,7 @@ env:
SPARK_PRINT_LAUNCH_COMMAND: "true"
SPARK_LOCAL_IP: 127.0.0.1
ZEPPELIN_LOCAL_IP: 127.0.0.1
- INTERPRETERS: '!beam,!hbase,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!submarine,!sparql,!mongodb'
+ INTERPRETERS: '!beam,!hbase,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!neo4j,!submarine,!sparql,!mongodb'
jobs:
run-e2e-tests-in-zeppelin-web:
diff --git a/conf/interpreter-list b/conf/interpreter-list
index 3be3396aee..51be181f31 100644
--- a/conf/interpreter-list
+++ b/conf/interpreter-list
@@ -25,7 +25,6 @@ cassandra org.apache.zeppelin:zeppelin-cassandra:0.10.0 Cassand
elasticsearch org.apache.zeppelin:zeppelin-elasticsearch:0.10.0 Elasticsearch interpreter
file org.apache.zeppelin:zeppelin-file:0.10.0 HDFS file interpreter
flink org.apache.zeppelin:zeppelin-flink:0.10.0 Flink interpreter
-geode org.apache.zeppelin:zeppelin-geode:0.10.0 Apache Geode interpreter
groovy org.apache.zeppelin:zeppelin-groovy:0.10.0 Groovy interpreter
hbase org.apache.zeppelin:zeppelin-hbase:0.10.0 Hbase interpreter
ignite org.apache.zeppelin:zeppelin-ignite:0.10.0 Ignite interpreter
diff --git a/dev/create_release.sh b/dev/create_release.sh
index 0fa3b50de7..6e1ae8923d 100755
--- a/dev/create_release.sh
+++ b/dev/create_release.sh
@@ -98,7 +98,7 @@ function make_binary_release() {
git_clone
make_source_package
-make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl !beam,!hbase,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!geode,!neo4j,!submarine,!sparql,!mongodb,!ksql -am"
+make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl !beam,!hbase,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!livy,!groovy,!sap,!java,!neo4j,!submarine,!sparql,!mongodb,!ksql -am"
make_binary_release all "-Pweb-angular -Phadoop-2.6"
# remove non release files and dirs
diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html
index 1cc4ba02ad..57fe76b8d4 100644
--- a/docs/_includes/themes/zeppelin/_navigation.html
+++ b/docs/_includes/themes/zeppelin/_navigation.html
@@ -143,7 +143,6 @@
<li><a href="{{BASE_PATH}}/interpreter/bigquery.html">BigQuery</a></li>
<li><a href="{{BASE_PATH}}/interpreter/cassandra.html">Cassandra</a></li>
<li><a href="{{BASE_PATH}}/interpreter/elasticsearch.html">Elasticsearch</a></li>
- <li><a href="{{BASE_PATH}}/interpreter/geode.html">Geode</a></li>
<li><a href="{{BASE_PATH}}/interpreter/groovy.html">Groovy</a></li>
<li><a href="{{BASE_PATH}}/interpreter/hbase.html">HBase</a></li>
<li><a href="{{BASE_PATH}}/interpreter/hdfs.html">HDFS</a></li>
diff --git a/docs/index.md b/docs/index.md
index e5a068530f..228778df5b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -140,7 +140,6 @@ limitations under the License.
* [Cassandra](./interpreter/cassandra.html)
* [Elasticsearch](./interpreter/elasticsearch.html)
* [Flink](./interpreter/flink.html)
- * [Geode](./interpreter/geode.html)
* [Groovy](./interpreter/groovy.html)
* [HBase](./interpreter/hbase.html)
* [HDFS](./interpreter/hdfs.html)
diff --git a/docs/interpreter/geode.md b/docs/interpreter/geode.md
deleted file mode 100644
index bd6bb7bbf9..0000000000
--- a/docs/interpreter/geode.md
+++ /dev/null
@@ -1,218 +0,0 @@
----
-layout: page
-title: "Geode/Gemfire OQL Interpreter for Apache Zeppelin"
-description: "Apache Geode (incubating) provides a database-like consistency model, reliable transaction processing and a shared-nothing architecture to maintain very low latency performance with high concurrency processing."
-group: interpreter
----
-<!--
-Licensed 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.
--->
-{% include JB/setup %}
-
-# Geode/Gemfire OQL Interpreter for Apache Zeppelin
-
-<div id="toc"></div>
-
-## Overview
-<table class="table-configuration">
- <tr>
- <th>Name</th>
- <th>Class</th>
- <th>Description</th>
- </tr>
- <tr>
- <td>%geode.oql</td>
- <td>GeodeOqlInterpreter</td>
- <td>Provides OQL environment for Apache Geode</td>
- </tr>
-</table>
-
-This interpreter supports the [Geode](http://geode.incubator.apache.org/) [Object Query Language (OQL)](https://geode.incubator.apache.org/docs/guide/latest/developing/querying_basics/query_basics.html).
-With the OQL-based querying language:
-
-[<img align="right" src="http://img.youtube.com/vi/zvzzA9GXu3Q/3.jpg" alt="zeppelin-view" hspace="10" width="200"></img>](https://www.youtube.com/watch?v=zvzzA9GXu3Q)
-
-* You can query on any arbitrary object
-* You can navigate object collections
-* You can invoke methods and access the behavior of objects
-* Data mapping is supported
-* You are not required to declare types. Since you do not need type definitions, you can work across multiple languages
-* You are not constrained by a schema
-
-This [Video Tutorial](https://www.youtube.com/watch?v=zvzzA9GXu3Q) illustrates some of the features provided by the `Geode Interpreter`.
-
-## Create Interpreter
-By default Zeppelin creates one `Geode/OQL` instance. You can remove it or create more instances.
-
-Multiple Geode instances can be created, each configured to the same or different backend Geode cluster.
-But over time a `Notebook` can have only one Geode interpreter instance `bound`.
-That means you _cannot_ connect to different Geode clusters in the same `Notebook`.
-This is a known Zeppelin limitation.
-
-To create new Geode instance open the `Interpreter` section and click the `+Create` button.
-Pick a `Name` of your choice and from the `Interpreter` drop-down select `geode`.
-Then follow the configuration instructions and `Save` the new instance.
-
-> Note: The `Name` of the instance is used only to distinguish the instances while binding them to the `Notebook`. The `Name` is irrelevant inside the `Notebook`. In the `Notebook` you must use `%geode.oql` tag.
-
-## Bind to Notebook
-In the `Notebook` click on the `settings` icon in the top right corner.
-The select/deselect the interpreters to be bound with the `Notebook`.
-
-## Configuration
-You can modify the configuration of the Geode from the `Interpreter` section.
-The Geode interpreter expresses the following properties:
-
-<table class="table-configuration">
- <tr>
- <th>Property Name</th>
- <th>Description</th>
- <th>Default Value</th>
- </tr>
- <tr>
- <td>geode.locator.host</td>
- <td>The Geode Locator Host</td>
- <td>localhost</td>
- </tr>
- <tr>
- <td>geode.locator.port</td>
- <td>The Geode Locator Port</td>
- <td>10334</td>
- </tr>
- <tr>
- <td>geode.max.result</td>
- <td>Max number of OQL result to display to prevent the browser overload</td>
- <td>1000</td>
- </tr>
-</table>
-
-## How to use
-> *Tip 1: Use (CTRL + .) for OQL auto-completion.*
-
-> *Tip 2: Always start the paragraphs with the full `%geode.oql` prefix tag! The short notation: `%geode` would still be able run the OQL queries but the syntax highlighting and the auto-completions will be disabled.*
-
-### Create / Destroy Regions
-
-The OQL specification does not support [Geode Regions](https://cwiki.apache.org/confluence/display/GEODE/Index#Index-MainConceptsandComponents) mutation operations.
-To `create`/`destroy` regions one should use the [GFSH](https://geode.incubator.apache.org/docs/guide/latest/tools_modules/gfsh/chapter_overview.html) shell tool instead.
-In the following it is assumed that the GFSH is colocated with Zeppelin server.
-
-```bash
-%sh
-source /etc/geode/conf/geode-env.sh
-gfsh << EOF
-
- connect --locator=ambari.localdomain[10334]
-
- destroy region --name=/regionEmployee
- destroy region --name=/regionCompany
- create region --name=regionEmployee --type=REPLICATE
- create region --name=regionCompany --type=REPLICATE
-
- exit;
-EOF
-```
-
-Above snippet re-creates two regions: `regionEmployee` and `regionCompany`.
-Note that you have to explicitly specify the locator host and port.
-The values should match those you have used in the Geode Interpreter configuration.
-Comprehensive list of [GFSH Commands by Functional Area](https://geode.incubator.apache.org/docs/guide/latest/tools_modules/gfsh/gfsh_quick_reference.html).
-
-### Basic OQL
-```sql
-%geode.oql
-SELECT count(*) FROM /regionEmployee
-```
-
-OQL `IN` and `SET` filters:
-
-```sql
-%geode.oql
-SELECT * FROM /regionEmployee
-WHERE companyId IN SET(2) OR lastName IN SET('Tzolov13', 'Tzolov73')
-```
-
-OQL `JOIN` operations
-
-```sql
-%geode.oql
-SELECT e.employeeId, e.firstName, e.lastName, c.id as companyId, c.companyName, c.address
-FROM /regionEmployee e, /regionCompany c
-WHERE e.companyId = c.id
-```
-
-By default the QOL responses contain only the region entry values. To access the keys, query the `EntrySet` instead:
-
-```sql
-%geode.oql
-SELECT e.key, e.value.companyId, e.value.email
-FROM /regionEmployee.entrySet e
-```
-Following query will return the EntrySet value as a Blob:
-
-```sql
-%geode.oql
-SELECT e.key, e.value FROM /regionEmployee.entrySet e
-```
-
-> Note: You can have multiple queries in the same paragraph but only the result from the first is displayed. [[1](https://issues.apache.org/jira/browse/ZEPPELIN-178)], [[2](https://issues.apache.org/jira/browse/ZEPPELIN-212)].
-
-### GFSH Commands From The Shell
-Use the Shell Interpreter (`%sh`) to run OQL commands form the command line:
-
-```bash
-%sh
-source /etc/geode/conf/geode-env.sh
-gfsh -e "connect" -e "list members"
-```
-
-### Apply Zeppelin Dynamic Forms
-You can leverage [Zeppelin Dynamic Form](../usage/dynamic_form/intro.html) inside your OQL queries. You can use both the `text input` and `select form` parameterization features
-
-```sql
-%geode.oql
-SELECT * FROM /regionEmployee e WHERE e.employeeId > ${Id}
-```
-
-### Auto-completion
-The Geode Interpreter provides a basic auto-completion functionality. On `(Ctrl+.)` it list the most relevant suggestions in a pop-up window.
-
-## Geode REST API
-To list the defined regions you can use the [Geode REST API](https://geode.apache.org/docs/guide/latest/rest_apps/chapter_overview.html):
-
-```
-http://<geode server hostname>phd1.localdomain:8484/gemfire-api/v1/
-```
-
-```json
-{
- "regions" : [{
- "name" : "regionEmployee",
- "type" : "REPLICATE",
- "key-constraint" : null,
- "value-constraint" : null
- }, {
- "name" : "regionCompany",
- "type" : "REPLICATE",
- "key-constraint" : null,
- "value-constraint" : null
- }]
-}
-```
-
-> To enable Geode REST API with JSON support add the following properties to geode.server.properties.file and restart:
-
-```
-http-service-port=8484
-start-dev-rest-api=true
-```
diff --git a/docs/usage/interpreter/installation.md b/docs/usage/interpreter/installation.md
index 36b192f813..48716f6bdb 100644
--- a/docs/usage/interpreter/installation.md
+++ b/docs/usage/interpreter/installation.md
@@ -152,11 +152,6 @@ You can also find the below community managed interpreter list in `conf/interpre
<td>org.apache.zeppelin:zeppelin-hbase:0.10.0</td>
<td>Hbase interpreter</td>
</tr>
- <tr>
- <td>geode</td>
- <td>org.apache.zeppelin:zeppelin-geode:0.10.0</td>
- <td>Apache Geode interpreter</td>
- </tr>
<tr>
<td>groovy</td>
<td>org.apache.zeppelin:zeppelin-groovy:0.10.0</td>
diff --git a/geode/pom.xml b/geode/pom.xml
deleted file mode 100644
index c521581f57..0000000000
--- a/geode/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ 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.
- -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>zeppelin-interpreter-parent</artifactId>
- <groupId>org.apache.zeppelin</groupId>
- <version>0.11.0-SNAPSHOT</version>
- <relativePath>../zeppelin-interpreter-parent/pom.xml</relativePath>
- </parent>
-
- <artifactId>zeppelin-geode</artifactId>
- <packaging>jar</packaging>
- <name>Zeppelin: Apache Geode interpreter</name>
-
- <properties>
- <!--library versions-->
- <interpreter.name>geode</interpreter.name>
- <geode.version>1.12.5</geode.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.geode</groupId>
- <artifactId>geode-core</artifactId>
- <version>${geode.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-exec</artifactId>
- <version>${commons.exec.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-enforcer-plugin</artifactId>
- </plugin>
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- </plugin>
- <plugin>
- <artifactId>maven-shade-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <skip>false</skip>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
diff --git a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java b/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
deleted file mode 100644
index a83410c17b..0000000000
--- a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.zeppelin.geode;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
-import org.apache.geode.cache.query.QueryService;
-import org.apache.geode.cache.query.SelectResults;
-import org.apache.geode.cache.query.Struct;
-import org.apache.geode.pdx.PdxInstance;
-import org.apache.zeppelin.interpreter.Interpreter;
-import org.apache.zeppelin.interpreter.InterpreterContext;
-import org.apache.zeppelin.interpreter.InterpreterResult;
-import org.apache.zeppelin.interpreter.InterpreterResult.Code;
-import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
-import org.apache.zeppelin.scheduler.Scheduler;
-import org.apache.zeppelin.scheduler.SchedulerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * Apache Geode OQL Interpreter (http://geode.apache.org)
- *
- * <ul>
- * <li>{@code geode.locator.host} - The Geode Locator {@code <HOST>} to connect to.</li>
- * <li>{@code geode.locator.port} - The Geode Locator {@code <PORT>} to connect to.</li>
- * <li>{@code geode.max.result} - Max number of OQL result to display.</li>
- * </ul>
- * <p>
- * Sample usages: <br/>
- * {@code %geode.oql} <br/>
- * {@code SELECT * FROM /regionEmployee e WHERE e.companyId > 95} <br/>
- * {@code SELECT * FROM /regionEmployee ORDER BY employeeId} <br/>
- * {@code
- * SELECT * FROM /regionEmployee
- * WHERE companyId IN SET(1, 3, 7) OR lastName IN SET('NameA', 'NameB')
- * } <br/>
- * {@code
- * SELECT e.employeeId, c.id as companyId FROM /regionEmployee e, /regionCompany c
- * WHERE e.companyId = c.id
- * }
- * </p>
- * <p>
- * OQL specification and sample queries:
- * http://geode-docs.cfapps.io/docs/getting_started/querying_quick_reference.html
- * </p>
- * <p>
- * When the Zeppelin server is collocated with Geode Shell (gfsh) one can use the %sh interpreter to
- * run Geode shell commands: <br/>
- * {@code
- * %sh
- * source /etc/geode/conf/geode-env.sh
- * gfsh << EOF
- * connect --locator=ambari.localdomain[10334]
- * destroy region --name=/regionEmployee
- * create region --name=regionEmployee --type=REPLICATE
- * exit;
- * EOF
- *}
- * </p>
- * <p>
- * Known issue:http://gemfire.docs.pivotal.io/bugnotes/KnownIssuesGemFire810.html #43673 Using query
- * "select * from /exampleRegion.entrySet" fails in a client-server topology and/or in a
- * PartitionedRegion.
- * </p>
- */
-public class GeodeOqlInterpreter extends Interpreter {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(GeodeOqlInterpreter.class);
-
- private static final char NEWLINE = '\n';
- private static final char TAB = '\t';
- private static final char WHITESPACE = ' ';
-
- private static final String TABLE_MAGIC_TAG = "%table ";
-
- private ClientCache clientCache = null;
- private QueryService queryService = null;
- private Exception exceptionOnConnect;
- private int maxResult;
-
- public GeodeOqlInterpreter(Properties property) {
- super(property);
- }
-
- protected ClientCache getClientCache() {
-
- String locatorHost = getProperty("geode.locator.host");
- int locatorPort = Integer.valueOf(getProperty("geode.locator.port"));
-
- ClientCache clientCache =
- new ClientCacheFactory().addPoolLocator(locatorHost, locatorPort).create();
-
- return clientCache;
- }
-
- @Override
- public void open() {
- LOGGER.info("Geode open connection called!");
-
- // Close the previous open connections.
- close();
-
- try {
- maxResult = Integer.valueOf(getProperty("geode.max.result"));
-
- clientCache = getClientCache();
- queryService = clientCache.getQueryService();
-
- exceptionOnConnect = null;
- LOGGER.info("Successfully created Geode connection");
- } catch (Exception e) {
- LOGGER.error("Cannot open connection", e);
- exceptionOnConnect = e;
- }
- }
-
- @Override
- public void close() {
- try {
- if (clientCache != null) {
- clientCache.close();
- }
-
- if (queryService != null) {
- queryService.closeCqs();
- }
-
- } catch (Exception e) {
- LOGGER.error("Cannot close connection", e);
- } finally {
- clientCache = null;
- queryService = null;
- exceptionOnConnect = null;
- }
- }
-
- private InterpreterResult executeOql(String oql) {
- try {
-
- if (getExceptionOnConnect() != null) {
- return new InterpreterResult(Code.ERROR, getExceptionOnConnect().getMessage());
- }
-
- @SuppressWarnings("unchecked")
- SelectResults<Object> results =
- (SelectResults<Object>) getQueryService().newQuery(oql).execute();
-
- StringBuilder msg = new StringBuilder(TABLE_MAGIC_TAG);
- boolean isTableHeaderSet = false;
-
- Iterator<Object> iterator = results.iterator();
- int rowDisplayCount = 0;
-
- while (iterator.hasNext() && (rowDisplayCount < getMaxResult())) {
-
- Object entry = iterator.next();
- rowDisplayCount++;
-
- if (entry instanceof Number) {
- handleNumberEntry(isTableHeaderSet, entry, msg);
- } else if (entry instanceof Struct) {
- handleStructEntry(isTableHeaderSet, entry, msg);
- } else if (entry instanceof PdxInstance) {
- handlePdxInstanceEntry(isTableHeaderSet, entry, msg);
- } else {
- handleUnsupportedTypeEntry(isTableHeaderSet, entry, msg);
- }
-
- isTableHeaderSet = true;
- msg.append(NEWLINE);
- }
-
- return new InterpreterResult(Code.SUCCESS, msg.toString());
-
- } catch (Exception ex) {
- LOGGER.error("Cannot run " + oql, ex);
- return new InterpreterResult(Code.ERROR, ex.getMessage());
- }
- }
-
- /**
- * Zeppelin's %TABLE convention uses tab (\t) to delimit fields and new-line (\n) to delimit rows
- * To complain with this convention we need to replace any occurrences of tab and/or newline
- * characters in the content.
- */
- private String replaceReservedChars(String str) {
-
- if (StringUtils.isBlank(str)) {
- return str;
- }
-
- return str.replace(TAB, WHITESPACE).replace(NEWLINE, WHITESPACE);
- }
-
- private void handleStructEntry(boolean isHeaderSet, Object entry, StringBuilder msg) {
- Struct struct = (Struct) entry;
- if (!isHeaderSet) {
- for (String titleName : struct.getStructType().getFieldNames()) {
- msg.append(replaceReservedChars(titleName)).append(TAB);
- }
- msg.append(NEWLINE);
- }
-
- for (String titleName : struct.getStructType().getFieldNames()) {
- msg.append(replaceReservedChars("" + struct.get(titleName))).append(TAB);
- }
- }
-
- private void handlePdxInstanceEntry(boolean isHeaderSet, Object entry, StringBuilder msg) {
- PdxInstance pdxEntry = (PdxInstance) entry;
- if (!isHeaderSet) {
- for (String titleName : pdxEntry.getFieldNames()) {
- msg.append(replaceReservedChars(titleName)).append(TAB);
- }
- msg.append(NEWLINE);
- }
-
- for (String titleName : pdxEntry.getFieldNames()) {
- msg.append(replaceReservedChars("" + pdxEntry.getField(titleName))).append(TAB);
- }
- }
-
- private void handleNumberEntry(boolean isHeaderSet, Object entry, StringBuilder msg) {
- if (!isHeaderSet) {
- msg.append("Result").append(NEWLINE);
- }
- msg.append(entry);
- }
-
- private void handleUnsupportedTypeEntry(boolean isHeaderSet, Object entry, StringBuilder msg) {
- if (!isHeaderSet) {
- msg.append("Unsuppoted Type").append(NEWLINE);
- }
- msg.append("" + entry);
- }
-
-
- @Override
- public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) {
- LOGGER.info("Run OQL command '{}'", cmd);
- return executeOql(cmd);
- }
-
- @Override
- public void cancel(InterpreterContext context) {
- // Do nothing
- }
-
- @Override
- public FormType getFormType() {
- return FormType.SIMPLE;
- }
-
- @Override
- public int getProgress(InterpreterContext context) {
- return 0;
- }
-
- @Override
- public Scheduler getScheduler() {
- return SchedulerFactory.singleton().createOrGetFIFOScheduler(
- GeodeOqlInterpreter.class.getName() + this.hashCode());
- }
-
- @Override
- public List<InterpreterCompletion> completion(String buf, int cursor,
- InterpreterContext interpreterContext) {
- return null;
- }
-
- public int getMaxResult() {
- return maxResult;
- }
-
- // Test only
- QueryService getQueryService() {
- return this.queryService;
- }
-
- Exception getExceptionOnConnect() {
- return this.exceptionOnConnect;
- }
-}
diff --git a/geode/src/main/resources/interpreter-setting.json b/geode/src/main/resources/interpreter-setting.json
deleted file mode 100644
index 2a0a81da6a..0000000000
--- a/geode/src/main/resources/interpreter-setting.json
+++ /dev/null
@@ -1,33 +0,0 @@
-[
- {
- "group": "geode",
- "name": "oql",
- "className": "org.apache.zeppelin.geode.GeodeOqlInterpreter",
- "properties": {
- "geode.locator.host": {
- "envName": null,
- "propertyName": "geode.locator.host",
- "defaultValue": "localhost",
- "description": "The Geode Locator Host.",
- "type": "string"
- },
- "geode.locator.port": {
- "envName": null,
- "propertyName": "geode.locator.port",
- "defaultValue": "10334",
- "description": "The Geode Locator Port.",
- "type": "number"
- },
- "geode.max.result": {
- "envName": null,
- "propertyName": "geode.max.result",
- "defaultValue": "1000",
- "description": "Max number of OQL result to display.",
- "type": "number"
- }
- },
- "editor": {
- "language": "sql"
- }
- }
-]
diff --git a/geode/src/test/java/org/apache/zeppelin/geode/GeodeOqlInterpreterTest.java b/geode/src/test/java/org/apache/zeppelin/geode/GeodeOqlInterpreterTest.java
deleted file mode 100644
index 440486334f..0000000000
--- a/geode/src/test/java/org/apache/zeppelin/geode/GeodeOqlInterpreterTest.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.zeppelin.geode;
-
-import org.apache.geode.cache.query.QueryService;
-import org.apache.geode.cache.query.SelectResults;
-import org.apache.geode.cache.query.Struct;
-import org.apache.geode.cache.query.internal.StructImpl;
-import org.apache.geode.cache.query.internal.types.StructTypeImpl;
-import org.apache.geode.pdx.PdxInstance;
-import org.apache.geode.pdx.internal.PdxInstanceImpl;
-import org.apache.geode.pdx.internal.PdxType;
-import org.apache.zeppelin.interpreter.Interpreter.FormType;
-import org.apache.zeppelin.interpreter.InterpreterResult;
-import org.apache.zeppelin.interpreter.InterpreterResult.Code;
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Properties;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class GeodeOqlInterpreterTest {
-
- private static final String OQL_QUERY = "select * from /region";
-
- private static Iterator<Object> asIterator(Object... items) {
- return new ArrayList<Object>(Arrays.asList(items)).iterator();
- }
-
- @Test
- public void testOpenCommandIndempotency() {
-
- Properties properties = new Properties();
- properties.put("geode.locator.host", "localhost");
- properties.put("geode.locator.port", "10334");
- properties.put("geode.max.result", "1000");
-
- GeodeOqlInterpreter spyGeodeOqlInterpreter = spy(new GeodeOqlInterpreter(properties));
-
- // Ensure that an attempt to open new connection will clean any remaining connections
- spyGeodeOqlInterpreter.open();
- spyGeodeOqlInterpreter.open();
- spyGeodeOqlInterpreter.open();
-
- verify(spyGeodeOqlInterpreter, times(3)).open();
- verify(spyGeodeOqlInterpreter, times(3)).close();
- }
-
- @Test
- public void oqlNumberResponse() throws Exception {
- testOql(asIterator(66, 67), "Result\n66\n67\n", 10);
- testOql(asIterator(66, 67), "Result\n66\n", 1);
- }
-
- @Test
- public void oqlStructResponse() throws Exception {
- String[] fields = new String[]{"field1", "field2"};
- Struct s1 = new StructImpl(new StructTypeImpl(fields), new String[]{"val11", "val12"});
- Struct s2 = new StructImpl(new StructTypeImpl(fields), new String[]{"val21", "val22"});
-
- testOql(asIterator(s1, s2), "field1\tfield2\t\nval11\tval12\t\nval21\tval22\t\n", 10);
- testOql(asIterator(s1, s2), "field1\tfield2\t\nval11\tval12\t\n", 1);
- }
-
- @Test
- public void oqlStructResponseWithReservedCharacters() throws Exception {
- String[] fields = new String[]{"fi\teld1", "f\nield2"};
- Struct s1 = new StructImpl(new StructTypeImpl(fields), new String[]{"v\nal\t1", "val2"});
-
- testOql(asIterator(s1), "fi eld1\tf ield2\t\nv al 1\tval2\t\n", 10);
- }
-
- @Test
- public void oqlPdxInstanceResponse() throws Exception {
- ByteArrayInputStream bais = new ByteArrayInputStream("koza\tboza\n".getBytes());
- PdxInstance pdx1 = new PdxInstanceImpl(new PdxType(), new DataInputStream(bais), 4);
- PdxInstance pdx2 = new PdxInstanceImpl(new PdxType(), new DataInputStream(bais), 4);
-
- testOql(asIterator(pdx1, pdx2), "\n", 10);
- testOql(asIterator(pdx1, pdx2), "\n", 1);
- }
-
- private static class DummyUnspportedType {
- @Override
- public String toString() {
- return "Unsupported Indeed";
- }
- }
-
- @Test
- public void oqlUnsupportedTypeResponse() throws Exception {
- DummyUnspportedType unspported1 = new DummyUnspportedType();
- DummyUnspportedType unspported2 = new DummyUnspportedType();
-
- testOql(asIterator(unspported1, unspported2), "Unsuppoted Type\n" + unspported1.toString()
- + "\n" + unspported1.toString() + "\n", 10);
- }
-
- private void testOql(Iterator<Object> queryResponseIterator, String expectedOutput, int maxResult)
- throws Exception {
-
- GeodeOqlInterpreter spyGeodeOqlInterpreter = spy(new GeodeOqlInterpreter(new Properties()));
-
- QueryService mockQueryService = mock(QueryService.class, RETURNS_DEEP_STUBS);
-
- when(spyGeodeOqlInterpreter.getQueryService()).thenReturn(mockQueryService);
- when(spyGeodeOqlInterpreter.getMaxResult()).thenReturn(maxResult);
-
- @SuppressWarnings("unchecked")
- SelectResults<Object> mockResults = mock(SelectResults.class);
-
- when(mockQueryService.newQuery(eq(OQL_QUERY)).execute()).thenReturn(mockResults);
-
- when(mockResults.iterator()).thenReturn(queryResponseIterator);
-
- InterpreterResult interpreterResult = spyGeodeOqlInterpreter.interpret(OQL_QUERY, null);
-
- assertEquals(Code.SUCCESS, interpreterResult.code());
- assertEquals(expectedOutput, interpreterResult.message().get(0).getData());
- }
-
- @Test
- public void oqlWithQueryException() throws Exception {
-
- GeodeOqlInterpreter spyGeodeOqlInterpreter = spy(new GeodeOqlInterpreter(new Properties()));
-
- when(spyGeodeOqlInterpreter.getExceptionOnConnect()).thenReturn(
- new RuntimeException("Test Exception On Connect"));
-
- InterpreterResult interpreterResult = spyGeodeOqlInterpreter.interpret(OQL_QUERY, null);
-
- assertEquals(Code.ERROR, interpreterResult.code());
- assertEquals("Test Exception On Connect", interpreterResult.message().get(0).getData());
- }
-
- @Test
- public void oqlWithExceptionOnConnect() throws Exception {
-
- GeodeOqlInterpreter spyGeodeOqlInterpreter = spy(new GeodeOqlInterpreter(new Properties()));
-
- when(spyGeodeOqlInterpreter.getQueryService()).thenThrow(
- new RuntimeException("Expected Test Exception!"));
-
- InterpreterResult interpreterResult = spyGeodeOqlInterpreter.interpret(OQL_QUERY, null);
-
- assertEquals(Code.ERROR, interpreterResult.code());
- assertEquals("Expected Test Exception!", interpreterResult.message().get(0).getData());
- }
-
- @Test
- public void testFormType() {
- assertEquals(FormType.SIMPLE, new GeodeOqlInterpreter(new Properties()).getFormType());
- }
-}
diff --git a/pom.xml b/pom.xml
index 879e61f726..d842697928 100644
--- a/pom.xml
+++ b/pom.xml
@@ -86,7 +86,6 @@
<module>sap</module>
<module>java</module>
<module>beam</module>
- <module>geode</module>
<module>ksql</module>
<module>sparql</module>
<module>zeppelin-common</module>