Unsubscribe On Wed, Jul 13, 2022, 18:08 <jongy...@apache.org> wrote:
> 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 f24a43f415 [ZEPPELIN-5723] Remove Kylin interpreter (#4406) > f24a43f415 is described below > > commit f24a43f415696f859fc67fe8c167c66f1e796121 > Author: yaini <80642154+ya...@users.noreply.github.com> > AuthorDate: Thu Jul 14 01:07:59 2022 +0900 > > [ZEPPELIN-5723] Remove Kylin interpreter (#4406) > --- > .github/workflows/core.yml | 2 +- > .github/workflows/frontend.yml | 2 +- > Dockerfile | 2 +- > conf/interpreter-list | 1 - > dev/create_release.sh | 2 +- > docs/_includes/themes/zeppelin/_navigation.html | 1 - > docs/index.md | 1 - > docs/interpreter/kylin.md | 82 ------ > docs/interpreter/submarine.md | 2 +- > docs/quickstart/sql_with_zeppelin.md | 1 - > docs/usage/interpreter/installation.md | 5 - > docs/usage/other_features/zeppelin_context.md | 2 +- > kylin/pom.xml | 79 ------ > .../apache/zeppelin/kylin/KylinErrorResponse.java | 62 ----- > .../apache/zeppelin/kylin/KylinInterpreter.java | 237 ----------------- > kylin/src/main/resources/interpreter-setting.json | 63 ----- > .../zeppelin/kylin/KylinInterpreterTest.java | 295 > --------------------- > pom.xml | 1 - > zeppelin-distribution/src/bin_license/LICENSE | 1 - > 19 files changed, 6 insertions(+), 835 deletions(-) > > diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml > index aceaf9fa11..4b3e42a369 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,pig,jdbc,file,flink-cmd,ignite,kylin,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql,scalding' > + INTERPRETERS: > 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql,scalding' > steps: > - name: Checkout > uses: actions/checkout@v2 > diff --git a/.github/workflows/frontend.yml > b/.github/workflows/frontend.yml > index 34cdef2b0f..11624c66b9 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,!pig,!jdbc,!file,!flink,!ignite,!kylin,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb' > + INTERPRETERS: > '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb' > > jobs: > run-e2e-tests-in-zeppelin-web: > diff --git a/Dockerfile b/Dockerfile > index 431b89c8cb..2aef45aa86 100644 > --- a/Dockerfile > +++ b/Dockerfile > @@ -23,7 +23,7 @@ RUN echo "unsafe-perm=true" > ~/.npmrc && \ > echo '{ "allow_root": true }' > ~/.bowerrc && \ > ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2 > -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular && \ > # Example with doesn't compile all interpreters > - # ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2 > -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular -pl > '!groovy,!submarine,!livy,!hbase,!pig,!file,!flink,!ignite,!kylin' && \ > + # ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2 > -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular -pl > '!groovy,!submarine,!livy,!hbase,!pig,!file,!flink,!ignite' && \ > mv > /workspace/zeppelin/zeppelin-distribution/target/zeppelin-*/zeppelin-* > /opt/zeppelin/ && \ > # Removing stuff saves time, because docker creates a temporary layer > rm -rf ~/.m2 && \ > diff --git a/conf/interpreter-list b/conf/interpreter-list > index c5e1dd8045..76584969c0 100644 > --- a/conf/interpreter-list > +++ b/conf/interpreter-list > @@ -33,7 +33,6 @@ ignite > org.apache.zeppelin:zeppelin-ignite:0.10.0 Ignite > java org.apache.zeppelin:zeppelin-java:0.10.0 > Java interpreter > jdbc org.apache.zeppelin:zeppelin-jdbc:0.10.0 > Jdbc interpreter > kotlin org.apache.zeppelin:zeppelin-kotlin:0.10.0 > Kotlin interpreter > -kylin org.apache.zeppelin:zeppelin-kylin:0.10.0 > Kylin interpreter > livy org.apache.zeppelin:zeppelin-livy:0.10.0 > Livy interpreter > md org.apache.zeppelin:zeppelin-markdown:0.10.0 > Markdown support > neo4j org.apache.zeppelin:zeppelin-neo4j:0.10.0 > Neo4j interpreter > diff --git a/dev/create_release.sh b/dev/create_release.sh > index 1f0c7ba6d9..a3bef0d1d5 100755 > --- a/dev/create_release.sh > +++ b/dev/create_release.sh > @@ -97,7 +97,7 @@ function make_binary_release() { > > git_clone > make_source_package > -make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl > !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!kylin,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql,!scalding > -am" > +make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl > !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql,!scalding > -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 f7d8e08ae8..205e8fc7fc 100644 > --- a/docs/_includes/themes/zeppelin/_navigation.html > +++ b/docs/_includes/themes/zeppelin/_navigation.html > @@ -155,7 +155,6 @@ > <li><a > href="{{BASE_PATH}}/interpreter/jupyter.html">Jupyter</a></li> > <li><a > href="{{BASE_PATH}}/interpreter/kotlin.html">Kotlin</a></li> > <li><a > href="{{BASE_PATH}}/interpreter/ksql.html">KSQL</a></li> > - <li><a > href="{{BASE_PATH}}/interpreter/kylin.html">Kylin</a></li> > <li><a > href="{{BASE_PATH}}/interpreter/livy.html">Livy</a></li> > <li><a > href="{{BASE_PATH}}/interpreter/mahout.html">Mahout</a></li> > <li><a > href="{{BASE_PATH}}/interpreter/markdown.html">Markdown</a></li> > diff --git a/docs/index.md b/docs/index.md > index 0b0cb8f41b..d955496160 100644 > --- a/docs/index.md > +++ b/docs/index.md > @@ -153,7 +153,6 @@ limitations under the License. > * [Jupyter](./interpreter/jupyter.html) > * [Kotlin](./interpreter/kotlin.html) > * [KSQL](./interpreter/ksql.html) > - * [Kylin](./interpreter/kylin.html) > * [Livy](./interpreter/livy.html) > * [Mahout](./interpreter/mahout.html) > * [Markdown](./interpreter/markdown.html) > diff --git a/docs/interpreter/kylin.md b/docs/interpreter/kylin.md > deleted file mode 100644 > index 1f2b0f3ab4..0000000000 > --- a/docs/interpreter/kylin.md > +++ /dev/null > @@ -1,82 +0,0 @@ > ---- > -layout: page > -title: "Apache Kylin Interpreter for Apache Zeppelin" > -description: "Apache Kylin™ is an open source Distributed Analytics > Engine designed to provide SQL interface and multi-dimensional analysis > (OLAP) on Hadoop supporting extremely large datasets, original contributed > from eBay Inc. > -." > -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 %} > - > -# Apache Kylin Interpreter for Apache Zeppelin > - > -<div id="toc"></div> > - > -## Overview > -[Apache Kylin](https://kylin.apache.org/) is an open source Distributed > Analytics Engine designed to provide SQL interface and multi-dimensional > analysis (OLAP) on Hadoop supporting extremely large datasets, original > contributed from eBay Inc. The interpreter assumes that Apache Kylin has > been installed and you can connect to Apache Kylin from the machine Apache > Zeppelin is installed. > -To get start with Apache Kylin, please see [Apache Kylin Quickstart]( > https://kylin.apache.org/docs15/index.html). > - > -## Configuration > -<table class="table-configuration"> > - <tr> > - <th>Name</th> > - <th>Default</th> > - <th>Description</th> > - </tr> > - <tr> > - <td>kylin.api.url </td> > - <td>http://localhost:7070/kylin/api/query</td> > - <td>kylin query POST API <br/> The format can be like http:// > <host>:<port>/kylin/api/query</td> > - </tr> > - <tr> > - <td>kylin.api.user</td> > - <td>ADMIN</td> > - <td>kylin user</td> > - </tr> > - <tr> > - <td>kylin.api.password</td> > - <td>KYLIN</td> > - <td>kylin password</td> > - </tr> > - <tr> > - <td>kylin.query.project</td> > - <td>learn_kylin</td> > - <td>String, Project to perform query. Could update at notebook > level</td> > - </tr> > - <tr> > - <td>kylin.query.ispartial</td> > - <td>true</td> > - <td>true|false <br/> (@Deprecated since Apache Kylin V1.5) <br/> > Whether accept a partial result or not, default be “false”. Set to “false” > for production use.</td> > - </tr> > - <tr> > - <td>kylin.query.limit</td> > - <td>5000</td> > - <td>int, Query limit <br/> If limit is set in sql, perPage will be > ignored.</td> > - </tr> > - <tr> > - <td>kylin.query.offset</td> > - <td>0</td> > - <td>int, Query offset <br/> If offset is set in sql, curIndex will be > ignored.</td> > - </tr> > -</table> > - > -## Using the Apache Kylin Interpreter > -In a paragraph, use `%kylin(project_name)` to select the **kylin** > interpreter, **project name** and then input **sql**. If no project name > defined, will use the default project name from the above configuration. > - > -```sql > -%kylin(learn_project) > -select count(*) from kylin_sales group by part_dt > -``` > - > diff --git a/docs/interpreter/submarine.md b/docs/interpreter/submarine.md > index 97be1bb7e0..cfad6255fc 100644 > --- a/docs/interpreter/submarine.md > +++ b/docs/interpreter/submarine.md > @@ -27,7 +27,7 @@ limitations under the License. > > A deep learning algorithm project requires data acquisition, data > processing, data cleaning, interactive visual programming adjustment > parameters, algorithm testing, algorithm publishing, algorithm job > scheduling, offline model training, model online services and many other > processes and processes. Zeppelin is a web-based notebook that supports > interactive data analysis. You can use SQL, Scala, Python, etc. to make > data-driven, interactive, collaborative documents. > > -You can use the more than 20 interpreters in zeppelin (for example: > spark, hive, Cassandra, Elasticsearch, Kylin, HBase, etc.) to collect data, > clean data, feature extraction, etc. in the data in Hadoop before > completing the machine learning model training. The data preprocessing > process. > +You can use the more than 20 interpreters in zeppelin (for example: > spark, hive, Cassandra, Elasticsearch, HBase, etc.) to collect data, clean > data, feature extraction, etc. in the data in Hadoop before completing the > machine learning model training. The data preprocessing process. > > By integrating submarine in zeppelin, we use zeppelin's data discovery, > data analysis and data visualization and collaboration capabilities to > visualize the results of algorithm development and parameter adjustment > during machine learning model training. > > diff --git a/docs/quickstart/sql_with_zeppelin.md > b/docs/quickstart/sql_with_zeppelin.md > index da709d5b94..39d57291a3 100644 > --- a/docs/quickstart/sql_with_zeppelin.md > +++ b/docs/quickstart/sql_with_zeppelin.md > @@ -63,7 +63,6 @@ For the further information about SQL support in > Zeppelin, please check > - [Flink Interpreter](../interpreter/flink.html) > - [Python Interpreter](../interpreter/python.html) > - [IgniteSQL > Interpreter](../interpreter/ignite.html#ignite-sql-interpreter) for [Apache > Ignite](https://ignite.apache.org/) > -- [Kylin Interpreter](../interpreter/kylin.html) for [Apache Kylin]( > http://kylin.apache.org/) > > > > diff --git a/docs/usage/interpreter/installation.md > b/docs/usage/interpreter/installation.md > index 3aec553c17..2e26b19896 100644 > --- a/docs/usage/interpreter/installation.md > +++ b/docs/usage/interpreter/installation.md > @@ -193,11 +193,6 @@ You can also find the below community managed > interpreter list in `conf/interpre > <td>org.apache.zeppelin:zeppelin-kotlin:0.7.0</td> > <td>Kotlin interpreter</td> > </tr> > - <tr> > - <td>kylin</td> > - <td>org.apache.zeppelin:zeppelin-kylin:0.10.0</td> > - <td>Kylin interpreter</td> > - </tr> > <tr> > <td>livy</td> > <td>org.apache.zeppelin:zeppelin-livy:0.10.0</td> > diff --git a/docs/usage/other_features/zeppelin_context.md > b/docs/usage/other_features/zeppelin_context.md > index 7b251719c3..784e1f34b8 100644 > --- a/docs/usage/other_features/zeppelin_context.md > +++ b/docs/usage/other_features/zeppelin_context.md > @@ -235,7 +235,7 @@ dynamic-forms and object-interpolation as described > below. > > | Interpreters that use Embedded Commands | > |-------------------------------------------------------------------| > -|spark.sql (\*), bigquery, cassandra, elasticsearch, file, hbase, ignite, > jdbc (\*), kylin, livy, markdown, neo4j, pig, python, shell (\*), zengine | > +|spark.sql (\*), bigquery, cassandra, elasticsearch, file, hbase, ignite, > jdbc (\*), livy, markdown, neo4j, pig, python, shell (\*), zengine | > > Dynamic forms are available in all of the interpreters in the table > above, > but object interpolation is only available in a small, but growing, list > of interpreters > diff --git a/kylin/pom.xml b/kylin/pom.xml > deleted file mode 100644 > index e21a6892ed..0000000000 > --- a/kylin/pom.xml > +++ /dev/null > @@ -1,79 +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-kylin</artifactId> > - <packaging>jar</packaging> > - <name>Zeppelin: Kylin interpreter</name> > - > - <properties> > - <interpreter.name>kylin</interpreter.name> > - </properties> > - > - <dependencies> > - <dependency> > - <groupId>com.google.code.gson</groupId> > - <artifactId>gson</artifactId> > - </dependency> > - > - <dependency> > - <groupId>org.apache.httpcomponents</groupId> > - <artifactId>httpclient</artifactId> > - </dependency> > - <dependency> > - <groupId>commons-codec</groupId> > - <artifactId>commons-codec</artifactId> > - </dependency> > - <dependency> > - <groupId>commons-io</groupId> > - <artifactId>commons-io</artifactId> > - </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/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java > b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java > deleted file mode 100644 > index 04d04797cc..0000000000 > --- a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java > +++ /dev/null > @@ -1,62 +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 > - * > - * 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.zeppelin.kylin; > - > -import com.google.gson.Gson; > -import com.google.gson.JsonSyntaxException; > -import org.apache.zeppelin.common.JsonSerializable; > - > -/** > - * class for Kylin Error Response. > - */ > -class KylinErrorResponse implements JsonSerializable { > - private static final Gson gson = new Gson(); > - > - private String stacktrace; > - private String exception; > - private String url; > - private String code; > - private Object data; > - private String msg; > - > - KylinErrorResponse(String stacktrace, String exception, String url, > - String code, Object data, String msg) { > - this.stacktrace = stacktrace; > - this.exception = exception; > - this.url = url; > - this.code = code; > - this.data = data; > - this.msg = msg; > - } > - > - public String getException() { > - return exception; > - } > - > - public String toJson() { > - return gson.toJson(this); > - } > - > - public static KylinErrorResponse fromJson(String json) { > - try { > - return gson.fromJson(json, KylinErrorResponse.class); > - } catch (JsonSyntaxException ex) { > - return null; > - } > - } > -} > diff --git > a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java > b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java > deleted file mode 100755 > index 444f5cbc28..0000000000 > --- a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java > +++ /dev/null > @@ -1,237 +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 > - * > - * 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.zeppelin.kylin; > - > -import org.apache.commons.codec.binary.Base64; > -import org.apache.commons.io.IOUtils; > -import org.apache.http.HttpResponse; > -import org.apache.http.client.HttpClient; > -import org.apache.http.client.methods.HttpPost; > -import org.apache.http.entity.StringEntity; > -import org.apache.http.impl.client.HttpClientBuilder; > -import org.slf4j.Logger; > -import org.slf4j.LoggerFactory; > - > -import java.io.IOException; > -import java.util.List; > -import java.util.Properties; > -import java.util.regex.Matcher; > -import java.util.regex.Pattern; > - > -import org.apache.zeppelin.interpreter.Interpreter; > -import org.apache.zeppelin.interpreter.InterpreterContext; > -import org.apache.zeppelin.interpreter.InterpreterResult; > -import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; > - > -/** > - * Kylin interpreter for Zeppelin. (http://kylin.apache.org) > - */ > -public class KylinInterpreter extends Interpreter { > - Logger logger = LoggerFactory.getLogger(KylinInterpreter.class); > - > - static final String KYLIN_QUERY_API_URL = "kylin.api.url"; > - static final String KYLIN_USERNAME = "kylin.api.user"; > - static final String KYLIN_PASSWORD = "kylin.api.password"; > - static final String KYLIN_QUERY_PROJECT = "kylin.query.project"; > - static final String KYLIN_QUERY_OFFSET = "kylin.query.offset"; > - static final String KYLIN_QUERY_LIMIT = "kylin.query.limit"; > - static final String KYLIN_QUERY_ACCEPT_PARTIAL = > "kylin.query.ispartial"; > - static final Pattern KYLIN_TABLE_FORMAT_REGEX_LABEL = > Pattern.compile("\"label\":\"(.*?)\""); > - static final Pattern KYLIN_TABLE_FORMAT_REGEX_RESULTS = > - Pattern.compile("\"results\":\\[\\[(.*?)]]"); > - > - public KylinInterpreter(Properties property) { > - super(property); > - } > - > - @Override > - public void open() { > - > - } > - > - @Override > - public void close() { > - > - } > - > - @Override > - public InterpreterResult interpret(String st, InterpreterContext > context) { > - try { > - return executeQuery(st); > - } catch (IOException e) { > - logger.error("failed to query data in kylin ", e); > - return new InterpreterResult(InterpreterResult.Code.ERROR, > e.getMessage()); > - } > - } > - > - @Override > - public void cancel(InterpreterContext context) { > - > - } > - > - @Override > - public FormType getFormType() { > - return FormType.SIMPLE; > - } > - > - @Override > - public int getProgress(InterpreterContext context) { > - return 0; > - } > - > - @Override > - public List<InterpreterCompletion> completion(String buf, int cursor, > - InterpreterContext interpreterContext) { > - return null; > - } > - > - public HttpResponse prepareRequest(String sql) throws IOException { > - String kylinProject = getProject(sql); > - String kylinSql = getSQL(sql); > - > - logger.info("project:" + kylinProject); > - logger.info("sql:" + kylinSql); > - logger.info("acceptPartial:" + > getProperty(KYLIN_QUERY_ACCEPT_PARTIAL)); > - logger.info("limit:" + getProperty(KYLIN_QUERY_LIMIT)); > - logger.info("offset:" + getProperty(KYLIN_QUERY_OFFSET)); > - byte[] encodeBytes = Base64.encodeBase64(new > String(getProperty(KYLIN_USERNAME) > - + ":" + getProperty(KYLIN_PASSWORD)).getBytes("UTF-8")); > - > - String postContent = new String("{\"project\":" + "\"" + kylinProject > + "\"" > - + "," + "\"sql\":" + "\"" + kylinSql + "\"" > - + "," + "\"acceptPartial\":" + "\"" + > getProperty(KYLIN_QUERY_ACCEPT_PARTIAL) + "\"" > - + "," + "\"offset\":" + "\"" + getProperty(KYLIN_QUERY_OFFSET) + > "\"" > - + "," + "\"limit\":" + "\"" + getProperty(KYLIN_QUERY_LIMIT) + > "\"" + "}"); > - logger.info("post:" + postContent); > - postContent = postContent.replaceAll("[\u0000-\u001f]", " "); > - StringEntity entity = new StringEntity(postContent, "UTF-8"); > - entity.setContentType("application/json; charset=UTF-8"); > - > - logger.info("post url:" + getProperty(KYLIN_QUERY_API_URL)); > - > - HttpPost postRequest = new HttpPost(getProperty(KYLIN_QUERY_API_URL)); > - postRequest.setEntity(entity); > - postRequest.addHeader("Authorization", "Basic " + new > String(encodeBytes)); > - postRequest.addHeader("Accept-Encoding", "UTF-8"); > - > - HttpClient httpClient = HttpClientBuilder.create().build(); > - return httpClient.execute(postRequest); > - } > - > - public String getProject(String cmd) { > - boolean isFirstLineProject = cmd.startsWith("("); > - > - if (isFirstLineProject) { > - int projectStartIndex = cmd.indexOf("("); > - int projectEndIndex = cmd.indexOf(")"); > - if (projectStartIndex != -1 && projectEndIndex != -1) { > - return cmd.substring(projectStartIndex + 1, projectEndIndex); > - } else { > - return getProperty(KYLIN_QUERY_PROJECT); > - } > - } else { > - return getProperty(KYLIN_QUERY_PROJECT); > - } > - } > - > - public String getSQL(String cmd) { > - boolean isFirstLineProject = cmd.startsWith("("); > - > - if (isFirstLineProject) { > - int projectStartIndex = cmd.indexOf("("); > - int projectEndIndex = cmd.indexOf(")"); > - if (projectStartIndex != -1 && projectEndIndex != -1) { > - return cmd.substring(projectEndIndex + 1); > - } else { > - return cmd; > - } > - } else { > - return cmd; > - } > - } > - > - private InterpreterResult executeQuery(String sql) throws IOException { > - HttpResponse response = prepareRequest(sql); > - String result; > - > - try { > - int code = response.getStatusLine().getStatusCode(); > - result = IOUtils.toString(response.getEntity().getContent(), > "UTF-8"); > - > - if (code != 200) { > - StringBuilder errorMessage = new StringBuilder("Failed : HTTP > error code " + code + " ."); > - logger.error("Failed to execute query: " + result); > - > - KylinErrorResponse kylinErrorResponse = > KylinErrorResponse.fromJson(result); > - if (kylinErrorResponse == null) { > - logger.error("Cannot get json from string: " + result); > - // when code is 401, the response is html, not json > - if (code == 401) { > - errorMessage.append(" Error message: Unauthorized. This > request requires " > - + "HTTP authentication. Please make sure your have set > your credentials " > - + "correctly."); > - } else { > - errorMessage.append(" Error message: " + result + " ."); > - } > - } else { > - String exception = kylinErrorResponse.getException(); > - logger.error("The exception is " + exception); > - errorMessage.append(" Error message: " + exception + " ."); > - } > - > - return new InterpreterResult(InterpreterResult.Code.ERROR, > errorMessage.toString()); > - } > - } catch (NullPointerException | IOException e) { > - throw new IOException(e); > - } > - > - return new InterpreterResult(InterpreterResult.Code.SUCCESS, > - formatResult(result)); > - } > - > - String formatResult(String msg) { > - StringBuilder res = new StringBuilder("%table "); > - > - Matcher ml = KYLIN_TABLE_FORMAT_REGEX_LABEL.matcher(msg); > - while (!ml.hitEnd() && ml.find()) { > - res.append(ml.group(1) + " \t"); > - } > - res.append(" \n"); > - > - Matcher mr = KYLIN_TABLE_FORMAT_REGEX_RESULTS.matcher(msg); > - String table = null; > - while (!mr.hitEnd() && mr.find()) { > - table = mr.group(1); > - } > - > - if (table != null && !table.isEmpty()) { > - String[] row = table.split("],\\["); > - for (int i = 0; i < row.length; i++) { > - String[] col = row[i].split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", > -1); > - for (int j = 0; j < col.length; j++) { > - if (col[j] != null) { > - col[j] = col[j].replaceAll("^\"|\"$", ""); > - } > - res.append(col[j] + " \t"); > - } > - res.append(" \n"); > - } > - } > - return res.toString(); > - } > -} > diff --git a/kylin/src/main/resources/interpreter-setting.json > b/kylin/src/main/resources/interpreter-setting.json > deleted file mode 100644 > index 88cf369692..0000000000 > --- a/kylin/src/main/resources/interpreter-setting.json > +++ /dev/null > @@ -1,63 +0,0 @@ > -[ > - { > - "group": "kylin", > - "name": "kylin", > - "className": "org.apache.zeppelin.kylin.KylinInterpreter", > - "properties": { > - "kylin.api.url": { > - "envName": null, > - "propertyName": "kylin.api.url", > - "defaultValue": "http://localhost:7070/kylin/api/query", > - "description": "Kylin API", > - "type": "url" > - }, > - "kylin.api.user": { > - "envName": null, > - "propertyName": "kylin.api.user", > - "defaultValue": "ADMIN", > - "description": "Kylin username", > - "type": "string" > - }, > - "kylin.api.password": { > - "envName": null, > - "propertyName": "kylin.api.password", > - "defaultValue": "KYLIN", > - "description": "Kylin password", > - "type": "password" > - }, > - "kylin.query.project": { > - "envName": null, > - "propertyName": "kylin.query.project", > - "defaultValue": "learn_kylin", > - "description": "Default Kylin project name", > - "type": "textarea" > - }, > - "kylin.query.offset": { > - "envName": null, > - "propertyName": "kylin.query.offset", > - "defaultValue": "0", > - "description": "Kylin query offset", > - "type": "number" > - }, > - "kylin.query.limit": { > - "envName": null, > - "propertyName": "kylin.query.limit", > - "defaultValue": "5000", > - "description": "Kylin query limit", > - "type": "number" > - }, > - "kylin.query.ispartial": { > - "envName": null, > - "propertyName": "kylin.query.ispartial", > - "defaultValue": true, > - "description": "Kylin query partial flag, deprecated", > - "type": "checkbox" > - } > - }, > - "editor": { > - "language": "sql", > - "editOnDblClick": false, > - "completionSupport": true > - } > - } > -] > diff --git > a/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java > b/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java > deleted file mode 100755 > index 66b6f9afb3..0000000000 > --- > a/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java > +++ /dev/null > @@ -1,295 +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 > - * > - * 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.zeppelin.kylin; > - > -import static org.junit.Assert.assertEquals; > - > -import org.apache.http.Header; > -import org.apache.http.HttpEntity; > -import org.apache.http.HttpResponse; > -import org.apache.http.ProtocolVersion; > -import org.apache.http.StatusLine; > -import org.apache.http.client.methods.HttpPost; > -import org.apache.http.message.AbstractHttpMessage; > -import org.junit.Assert; > -import org.junit.BeforeClass; > -import org.junit.Test; > - > -import java.io.ByteArrayInputStream; > -import java.io.IOException; > -import java.io.InputStream; > -import java.io.OutputStream; > -import java.util.Locale; > -import java.util.Properties; > - > -import org.apache.zeppelin.interpreter.InterpreterResult; > - > -public class KylinInterpreterTest { > - static final Properties KYLIN_PROPERTIES = new Properties(); > - > - @BeforeClass > - public static void setUpClass() { > - KYLIN_PROPERTIES.put("kylin.api.url", " > http://localhost:7070/kylin/api/query"); > - KYLIN_PROPERTIES.put("kylin.api.user", "ADMIN"); > - KYLIN_PROPERTIES.put("kylin.api.password", "KYLIN"); > - KYLIN_PROPERTIES.put("kylin.query.project", "default"); > - KYLIN_PROPERTIES.put("kylin.query.offset", "0"); > - KYLIN_PROPERTIES.put("kylin.query.limit", "5000"); > - KYLIN_PROPERTIES.put("kylin.query.ispartial", "true"); > - } > - > - @Test > - public void testWithDefault() { > - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties()); > - InterpreterResult result = t.interpret( > - "select a.date,sum(b.measure) as measure from kylin_fact_table a > " + > - "inner join kylin_lookup_table b on a.date=b.date group by > a.date", null); > - assertEquals("default", t.getProject("select a.date,sum(b.measure) as > measure " > - + "from kylin_fact_table a inner join kylin_lookup_table b on > a.date=b.date " > - + "group by a.date")); > - assertEquals(InterpreterResult.Type.TABLE, > result.message().get(0).getType()); > - } > - > - @Test > - public void testWithProject() { > - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties()); > - assertEquals("project2", t.getProject("(project2)\n select > a.date,sum(b.measure) " > - + "as measure from kylin_fact_table a inner join > kylin_lookup_table b on " > - + "a.date=b.date group by a.date")); > - assertEquals("", t.getProject("()\n select a.date,sum(b.measure) as > measure " > - + "from kylin_fact_table a inner join kylin_lookup_table b on > a.date=b.date " > - + "group by a.date")); > - assertEquals("\n select a.date,sum(b.measure) as measure from > kylin_fact_table a " > - + "inner join kylin_lookup_table b on a.date=b.date group by > a.date", > - t.getSQL("(project2)\n select a.date,sum(b.measure) as > measure " > - + "from kylin_fact_table a inner join > kylin_lookup_table b on a.date=b.date " > - + "group by a.date")); > - assertEquals("\n select a.date,sum(b.measure) as measure from > kylin_fact_table a " > - + "inner join kylin_lookup_table b on a.date=b.date group by > a.date", > - t.getSQL("()\n select a.date,sum(b.measure) as measure from > kylin_fact_table a " > - + "inner join kylin_lookup_table b on a.date=b.date > group by a.date")); > - } > - > - @Test > - public void testParseResult() { > - String msg = > "{\"columnMetas\":[{\"isNullable\":1,\"displaySize\":256,\"label\":\"COUNTRY\"," > - + > "\"name\":\"COUNTRY\",\"schemaName\":\"DEFAULT\",\"catelogName\":null," > - + > "\"tableName\":\"SALES_TABLE\",\"precision\":256,\"scale\":0,\"columnType\":12," > - + > "\"columnTypeName\":\"VARCHAR\",\"writable\":false,\"readOnly\":true," > - + > "\"definitelyWritable\":false,\"autoIncrement\":false,\"caseSensitive\":true," > - + > "\"searchable\":false,\"currency\":false,\"signed\":true},{\"isNullable\":1," > - + > "\"displaySize\":256,\"label\":\"CURRENCY\",\"name\":\"CURRENCY\"," > - + > "\"schemaName\":\"DEFAULT\",\"catelogName\":null,\"tableName\":\"SALES_TABLE\"," > - + > "\"precision\":256,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR\"," > - + > "\"writable\":false,\"readOnly\":true,\"definitelyWritable\":false," > - + > "\"autoIncrement\":false,\"caseSensitive\":true,\"searchable\":false," > - + > "\"currency\":false,\"signed\":true},{\"isNullable\":0,\"displaySize\":19," > - + > "\"label\":\"COUNT__\",\"name\":\"COUNT__\",\"schemaName\":\"DEFAULT\"," > - + > "\"catelogName\":null,\"tableName\":\"SALES_TABLE\",\"precision\":19,\"scale\":0," > - + > "\"columnType\":-5,\"columnTypeName\":\"BIGINT\",\"writable\":false," > - + > "\"readOnly\":true,\"definitelyWritable\":false,\"autoIncrement\":false," > - + > "\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true}]," > - + > "\"results\":[[\"AMERICA\",\"USD\",null],[null,\"RMB\",0],[\"KOR\",null,100]," > - + > "[\"\\\"abc\\\"\",\"a,b,c\",-1]],\"cube\":\"Sample_Cube\",\"affectedRowCount\":0," > - + > "\"isException\":false,\"exceptionMessage\":null,\"duration\":134," > - + > "\"totalScanCount\":1,\"hitExceptionCache\":false,\"storageCacheUsed\":false," > - + "\"partial\":false}"; > - String expected = "%table COUNTRY \tCURRENCY \tCOUNT__ \t \n" + > - "AMERICA \tUSD \tnull \t \n" + > - "null \tRMB \t0 \t \n" + > - "KOR \tnull \t100 \t \n" + > - "\\\"abc\\\" \ta,b,c \t-1 \t \n"; > - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties()); > - String actual = t.formatResult(msg); > - Assert.assertEquals(expected, actual); > - } > - > - @Test > - public void testParseEmptyResult() { > - String msg = > "{\"columnMetas\":[{\"isNullable\":1,\"displaySize\":256,\"label\":\"COUNTRY\"," > - + > "\"name\":\"COUNTRY\",\"schemaName\":\"DEFAULT\",\"catelogName\":null," > - + > "\"tableName\":\"SALES_TABLE\",\"precision\":256,\"scale\":0,\"columnType\":12," > - + > "\"columnTypeName\":\"VARCHAR\",\"writable\":false,\"readOnly\":true," > - + > "\"definitelyWritable\":false,\"autoIncrement\":false,\"caseSensitive\":true," > - + > "\"searchable\":false,\"currency\":false,\"signed\":true},{\"isNullable\":1," > - + > "\"displaySize\":256,\"label\":\"CURRENCY\",\"name\":\"CURRENCY\"," > - + > "\"schemaName\":\"DEFAULT\",\"catelogName\":null,\"tableName\":\"SALES_TABLE\"," > - + > "\"precision\":256,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR\"," > - + > "\"writable\":false,\"readOnly\":true,\"definitelyWritable\":false," > - + > "\"autoIncrement\":false,\"caseSensitive\":true,\"searchable\":false," > - + > "\"currency\":false,\"signed\":true},{\"isNullable\":0,\"displaySize\":19," > - + > "\"label\":\"COUNT__\",\"name\":\"COUNT__\",\"schemaName\":\"DEFAULT\"," > - + > "\"catelogName\":null,\"tableName\":\"SALES_TABLE\",\"precision\":19,\"scale\":0," > - + > "\"columnType\":-5,\"columnTypeName\":\"BIGINT\",\"writable\":false," > - + > "\"readOnly\":true,\"definitelyWritable\":false,\"autoIncrement\":false," > - + > "\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true}]," > - + "\"results\":[]," + > "\"cube\":\"Sample_Cube\",\"affectedRowCount\":0," > - + > "\"isException\":false,\"exceptionMessage\":null,\"duration\":134," > - + > "\"totalScanCount\":1,\"hitExceptionCache\":false,\"storageCacheUsed\":false," > - + "\"partial\":false}"; > - String expected = "%table COUNTRY \tCURRENCY \tCOUNT__ \t \n"; > - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties()); > - String actual = t.formatResult(msg); > - Assert.assertEquals(expected, actual); > - } > - > - private Properties getDefaultProperties() { > - Properties prop = new Properties(); > - prop.put("kylin.api.username", "ADMIN"); > - prop.put("kylin.api.password", "KYLIN"); > - prop.put("kylin.api.url", "http://<host>:<port>/kylin/api/query"); > - prop.put("kylin.query.project", "default"); > - prop.put("kylin.query.offset", "0"); > - prop.put("kylin.query.limit", "5000"); > - prop.put("kylin.query.ispartial", "true"); > - return prop; > - } > -} > - > -class MockKylinInterpreter extends KylinInterpreter { > - MockKylinInterpreter(Properties property) { > - super(property); > - } > - > - @Override > - public HttpResponse prepareRequest(String sql) throws IOException { > - MockHttpClient client = new MockHttpClient(); > - return client.execute(new HttpPost()); > - } > -} > - > -class MockHttpClient{ > - public MockHttpResponse execute(HttpPost post){ > - return new MockHttpResponse(); > - } > -} > - > -class MockHttpResponse extends AbstractHttpMessage implements > HttpResponse{ > - @Override > - public StatusLine getStatusLine() { > - return new MockStatusLine(); > - } > - > - @Override > - public void setStatusLine(StatusLine statusLine) { > - } > - > - @Override > - public void setStatusLine(ProtocolVersion protocolVersion, int i) { > - } > - > - @Override > - public void setStatusLine(ProtocolVersion protocolVersion, int i, > String s) { > - } > - > - @Override > - public void setStatusCode(int i) throws IllegalStateException { > - } > - > - @Override > - public void setReasonPhrase(String s) throws IllegalStateException { > - } > - > - @Override > - public HttpEntity getEntity() { > - return new MockEntity(); > - } > - > - @Override > - public void setEntity(HttpEntity httpEntity) { > - } > - > - @Override > - public Locale getLocale() { > - return null; > - } > - > - @Override > - public void setLocale(Locale locale) { > - } > - > - @Override > - public ProtocolVersion getProtocolVersion() { > - return null; > - } > -} > - > -class MockStatusLine implements StatusLine{ > - @Override > - public ProtocolVersion getProtocolVersion() { > - return null; > - } > - > - @Override > - public int getStatusCode() { > - return 200; > - } > - > - @Override > - public String getReasonPhrase() { > - return null; > - } > -} > - > -class MockEntity implements HttpEntity{ > - @Override > - public boolean isRepeatable() { > - return false; > - } > - > - @Override > - public boolean isChunked() { > - return false; > - } > - > - @Override > - public long getContentLength() { > - return 0; > - } > - > - @Override > - public Header getContentType() { > - return null; > - } > - > - @Override > - public Header getContentEncoding() { > - return null; > - } > - > - @Override > - public InputStream getContent() throws IOException, > IllegalStateException { > - return new ByteArrayInputStream(("{\"columnMetas\":" + > - "[{\"label\":\"PART_DT\"},{\"label\":\"measure\"}]," + > - "\"results\":[[\"2012-01-03\",\"917.4138\"]," + > - "[\"2012-05-06\",\"592.4823\"]]}").getBytes()); > - } > - > - @Override > - public void writeTo(OutputStream outputStream) throws IOException { > - } > - > - @Override > - public boolean isStreaming() { > - return false; > - } > - > - @Override > - public void consumeContent() throws IOException { > - } > -} > diff --git a/pom.xml b/pom.xml > index 78b011339c..da5b999307 100644 > --- a/pom.xml > +++ b/pom.xml > @@ -78,7 +78,6 @@ > <module>flink-cmd</module> > <module>ignite</module> > <module>influxdb</module> > - <module>kylin</module> > <module>python</module> > <module>cassandra</module> > <module>elasticsearch</module> > diff --git a/zeppelin-distribution/src/bin_license/LICENSE > b/zeppelin-distribution/src/bin_license/LICENSE > index 380b0a4349..a80dc4f4ea 100644 > --- a/zeppelin-distribution/src/bin_license/LICENSE > +++ b/zeppelin-distribution/src/bin_license/LICENSE > @@ -34,7 +34,6 @@ The following components are provided under Apache > License. > (Apache 2.0) Apache Cassandra (http://cassandra.apache.org/) > (Apache 2.0) Apache HBase (http://hbase.apache.org/) > (Apache 2.0) Apache Ignite (http://ignite.apache.org/) > - (Apache 2.0) Apache Kylin (http://kylin.apache.org/) > (Apache 2.0) Apache Flink (http://flink.apache.org/) > (Apache 2.0) Apache Jena (https://jena.apache.org/) > (Apache 2.0) Apache Beam (http://beam.apache.org/) > >