http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/cassandra/src/test/java/org/apache/zeppelin/cassandra/CassandraInterpreterTest.java ---------------------------------------------------------------------- diff --git a/cassandra/src/test/java/org/apache/zeppelin/cassandra/CassandraInterpreterTest.java b/cassandra/src/test/java/org/apache/zeppelin/cassandra/CassandraInterpreterTest.java index 7ee6351..df5e4ac 100644 --- a/cassandra/src/test/java/org/apache/zeppelin/cassandra/CassandraInterpreterTest.java +++ b/cassandra/src/test/java/org/apache/zeppelin/cassandra/CassandraInterpreterTest.java @@ -16,8 +16,13 @@ */ package org.apache.zeppelin.cassandra; -import static com.datastax.driver.core.ProtocolOptions.DEFAULT_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS; import static com.google.common.collect.FluentIterable.from; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import static com.datastax.driver.core.ProtocolOptions.DEFAULT_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS; + import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_CLUSTER_NAME; import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_COMPRESSION_PROTOCOL; import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_CREDENTIALS_PASSWORD; @@ -47,22 +52,7 @@ import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_SOCKE import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_SOCKET_READ_TIMEOUT_MILLIS; import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_SOCKET_TCP_NO_DELAY; import static org.apache.zeppelin.cassandra.CassandraInterpreter.CASSANDRA_SPECULATIVE_EXECUTION_POLICY; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.ProtocolVersion; -import com.datastax.driver.core.Session; -import info.archinnov.achilles.embedded.CassandraEmbeddedServerBuilder; -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Properties; -import org.apache.zeppelin.display.AngularObjectRegistry; -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.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -73,12 +63,29 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Properties; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.ProtocolVersion; +import com.datastax.driver.core.Session; + +import info.archinnov.achilles.embedded.CassandraEmbeddedServerBuilder; + +import org.apache.zeppelin.display.AngularObjectRegistry; +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; + @RunWith(MockitoJUnitRunner.class) public class CassandraInterpreterTest { private static final String ARTISTS_TABLE = "zeppelin.artists"; - public static Session session = - CassandraEmbeddedServerBuilder.noEntityPackages() + public static Session session = CassandraEmbeddedServerBuilder + .noEntityPackages() .withKeyspaceName("zeppelin") .withScript("prepare_schema.cql") .withScript("prepare_data.cql") @@ -106,9 +113,8 @@ public class CassandraInterpreterTest { properties.setProperty(CASSANDRA_RECONNECTION_POLICY, "DEFAULT"); properties.setProperty(CASSANDRA_SPECULATIVE_EXECUTION_POLICY, "DEFAULT"); - properties.setProperty( - CASSANDRA_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS, - DEFAULT_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS + ""); + properties.setProperty(CASSANDRA_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS, + DEFAULT_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS + ""); properties.setProperty(CASSANDRA_POOLING_NEW_CONNECTION_THRESHOLD_LOCAL, "100"); properties.setProperty(CASSANDRA_POOLING_NEW_CONNECTION_THRESHOLD_REMOTE, "100"); @@ -131,11 +137,10 @@ public class CassandraInterpreterTest { properties.setProperty(CASSANDRA_SOCKET_READ_TIMEOUT_MILLIS, "12000"); properties.setProperty(CASSANDRA_SOCKET_TCP_NO_DELAY, "true"); - properties.setProperty( - CASSANDRA_HOSTS, - from(cluster.getMetadata().getAllHosts()).first().get().getAddress().getHostAddress()); - properties.setProperty( - CASSANDRA_PORT, cluster.getConfiguration().getProtocolOptions().getPort() + ""); + properties.setProperty(CASSANDRA_HOSTS, from(cluster.getMetadata().getAllHosts()).first() + .get().getAddress().getHostAddress()); + properties.setProperty(CASSANDRA_PORT, cluster.getConfiguration().getProtocolOptions() + .getPort() + ""); interpreter = new CassandraInterpreter(properties); interpreter.open(); } @@ -153,418 +158,392 @@ public class CassandraInterpreterTest { @Test public void should_create_cluster_and_session_upon_call_to_open() throws Exception { assertThat(interpreter.cluster).isNotNull(); - assertThat(interpreter.cluster.getClusterName()) - .isEqualTo(session.getCluster().getClusterName()); + assertThat(interpreter.cluster.getClusterName()).isEqualTo(session.getCluster() + .getClusterName()); assertThat(interpreter.session).isNotNull(); assertThat(interpreter.helper).isNotNull(); } @Test public void should_interpret_simple_select() throws Exception { - // Given + //Given - // When - final InterpreterResult actual = - interpreter.interpret("SELECT * FROM " + ARTISTS_TABLE + " LIMIT 10;", intrContext); + //When + final InterpreterResult actual = interpreter.interpret("SELECT * FROM " + ARTISTS_TABLE + + " LIMIT 10;", intrContext); - // Then + //Then assertThat(actual).isNotNull(); assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo( - "name\tborn\tcountry\tdied\tgender\t" - + "styles\ttype\n" - + "Bogdan Raczynski\t1977-01-01\tPoland\tnull\tMale\t[Dance, Electro]\tPerson\n" - + "Krishna Das\t1947-05-31\tUSA\tnull\tMale\t[Unknown]\tPerson\n" - + "Sheryl Crow\t1962-02-11\tUSA\tnull\tFemale\t" - + "[Classic, Rock, Country, Blues, Pop, Folk]\tPerson\n" - + "Doof\t1968-08-31\tUnited Kingdom\tnull\tnull\t[Unknown]\tPerson\n" - + "House of Large Sizes\t1986-01-01\tUSA\t2003\tnull\t[Unknown]\tGroup\n" - + "Fanfarlo\t2006-01-01\tUnited Kingdom\tnull\tnull\t" - + "[Rock, Indie, Pop, Classic]\tGroup\n" - + "Jeff Beck\t1944-06-24\tUnited Kingdom\tnull\tMale\t[Rock, Pop, Classic]\tPerson\n" - + "Los Paranoias\tnull\tUnknown\tnull\tnull\t[Unknown]\tnull\n" - + "â¦And You Will Know Us by the Trail of Dead\t1994-01-01\tUSA\tnull\tnull\t" - + "[Rock, Pop, Classic]\tGroup\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("name\tborn\tcountry\tdied\tgender\t" + + "styles\ttype\n" + + "Bogdan Raczynski\t1977-01-01\tPoland\tnull\tMale\t[Dance, Electro]\tPerson\n" + + "Krishna Das\t1947-05-31\tUSA\tnull\tMale\t[Unknown]\tPerson\n" + + "Sheryl Crow\t1962-02-11\tUSA\tnull\tFemale\t" + + "[Classic, Rock, Country, Blues, Pop, Folk]\tPerson\n" + + "Doof\t1968-08-31\tUnited Kingdom\tnull\tnull\t[Unknown]\tPerson\n" + + "House of Large Sizes\t1986-01-01\tUSA\t2003\tnull\t[Unknown]\tGroup\n" + + "Fanfarlo\t2006-01-01\tUnited Kingdom\tnull\tnull\t" + + "[Rock, Indie, Pop, Classic]\tGroup\n" + + "Jeff Beck\t1944-06-24\tUnited Kingdom\tnull\tMale\t[Rock, Pop, Classic]\tPerson\n" + + "Los Paranoias\tnull\tUnknown\tnull\tnull\t[Unknown]\tnull\n" + + "â¦And You Will Know Us by the Trail of Dead\t1994-01-01\tUSA\tnull\tnull\t" + + "[Rock, Pop, Classic]\tGroup\n"); } @Test public void should_interpret_select_statement() throws Exception { - // Given + //Given - // When - final InterpreterResult actual = - interpreter.interpret("SELECT * FROM " + ARTISTS_TABLE + " LIMIT 2;", intrContext); + //When + final InterpreterResult actual = interpreter.interpret("SELECT * FROM " + ARTISTS_TABLE + + " LIMIT 2;", intrContext); - // Then + //Then assertThat(actual).isNotNull(); assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(actual.message().get(0).getData()) - .isEqualTo( - "name\tborn\tcountry\tdied\tgender\tstyles\ttype\n" - + "Bogdan Raczynski\t1977-01-01\tPoland\tnull\tMale\t[Dance, Electro]\tPerson\n" - + "Krishna Das\t1947-05-31\tUSA\tnull\tMale\t[Unknown]\tPerson\n"); + .isEqualTo("name\tborn\tcountry\tdied\tgender\tstyles\ttype\n" + + "Bogdan Raczynski\t1977-01-01\tPoland\tnull\tMale\t[Dance, Electro]\tPerson\n" + + "Krishna Das\t1947-05-31\tUSA\tnull\tMale\t[Unknown]\tPerson\n"); } @Test public void should_interpret_multiple_statements_with_single_line_logged_batch() { - // Given - String statements = - "CREATE TABLE IF NOT EXISTS zeppelin.albums(\n" - + " title text PRIMARY KEY,\n" - + " artist text,\n" - + " year int\n" - + ");\n" - + "BEGIN BATCH" - + " INSERT INTO zeppelin.albums(title,artist,year) " - + "VALUES('The Impossible Dream EP','Carter the Unstoppable Sex Machine',1992);" - + " INSERT INTO zeppelin.albums(title,artist,year) " - + "VALUES('The Way You Are','Tears for Fears',1983);" - + " INSERT INTO zeppelin.albums(title,artist,year) " - + "VALUES('Primitive','Soulfly',2003);" - + "APPLY BATCH;\n" - + "SELECT * FROM zeppelin.albums;"; - // When + //Given + String statements = "CREATE TABLE IF NOT EXISTS zeppelin.albums(\n" + + " title text PRIMARY KEY,\n" + + " artist text,\n" + + " year int\n" + + ");\n" + + "BEGIN BATCH" + + " INSERT INTO zeppelin.albums(title,artist,year) " + + "VALUES('The Impossible Dream EP','Carter the Unstoppable Sex Machine',1992);" + + " INSERT INTO zeppelin.albums(title,artist,year) " + + "VALUES('The Way You Are','Tears for Fears',1983);" + + " INSERT INTO zeppelin.albums(title,artist,year) " + + "VALUES('Primitive','Soulfly',2003);" + + "APPLY BATCH;\n" + + "SELECT * FROM zeppelin.albums;"; + //When final InterpreterResult actual = interpreter.interpret(statements, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo( - "title\tartist\tyear\n" - + "The Impossible Dream EP\tCarter the Unstoppable Sex Machine\t1992\n" - + "The Way You Are\tTears for Fears\t1983\n" - + "Primitive\tSoulfly\t2003\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("title\tartist\tyear\n" + + "The Impossible Dream EP\tCarter the Unstoppable Sex Machine\t1992\n" + + "The Way You Are\tTears for Fears\t1983\n" + + "Primitive\tSoulfly\t2003\n"); } - + @Test public void should_throw_statement_not_having_semi_colon() throws Exception { - // Given + //Given String statement = "SELECT * zeppelin.albums"; - // When + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()) - .contains( - "Error parsing input:\n" - + "\t'SELECT * zeppelin.albums'\n" - + "Did you forget to add ; (semi-colon) at the end of each CQL statement ?"); + .contains("Error parsing input:\n" + + "\t'SELECT * zeppelin.albums'\n" + + "Did you forget to add ; (semi-colon) at the end of each CQL statement ?"); } @Test public void should_validate_statement() throws Exception { - // Given + //Given String statement = "SELECT * zeppelin.albums;"; - // When + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()) - .contains("line 1:9 missing K_FROM at 'zeppelin' (SELECT * [zeppelin]....)"); + .contains("line 1:9 missing K_FROM at 'zeppelin' (SELECT * [zeppelin]....)"); } @Test public void should_execute_statement_with_consistency_option() throws Exception { - // Given - String statement = "@consistency=THREE\n" + "SELECT * FROM zeppelin.artists LIMIT 1;"; + //Given + String statement = "@consistency=THREE\n" + + "SELECT * FROM zeppelin.artists LIMIT 1;"; - // When + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()) - .contains( - "Not enough replicas available for query at consistency THREE (3 required " - + "but only 1 alive)"); + .contains("Not enough replicas available for query at consistency THREE (3 required " + + "but only 1 alive)"); } @Test public void should_execute_statement_with_serial_consistency_option() throws Exception { - // Given - String statement = "@serialConsistency=SERIAL\n" + "SELECT * FROM zeppelin.artists LIMIT 1;"; + //Given + String statement = "@serialConsistency=SERIAL\n" + + "SELECT * FROM zeppelin.artists LIMIT 1;"; - // When + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); } @Test public void should_execute_statement_with_timestamp_option() throws Exception { - // Given + //Given String statement1 = "INSERT INTO zeppelin.ts(key,val) VALUES('k','v1');"; - String statement2 = "@timestamp=15\n" + "INSERT INTO zeppelin.ts(key,val) VALUES('k','v2');"; + String statement2 = "@timestamp=15\n" + + "INSERT INTO zeppelin.ts(key,val) VALUES('k','v2');"; // Insert v1 with current timestamp interpreter.interpret(statement1, intrContext); Thread.sleep(1); - // When + //When // Insert v2 with past timestamp interpreter.interpret(statement2, intrContext); - final String actual = - session.execute("SELECT * FROM zeppelin.ts LIMIT 1").one().getString("val"); + final String actual = session.execute("SELECT * FROM zeppelin.ts LIMIT 1").one() + .getString("val"); - // Then + //Then assertThat(actual).isEqualTo("v1"); } @Test public void should_execute_statement_with_retry_policy() throws Exception { - // Given - String statement = - "@retryPolicy=" - + interpreter.LOGGING_DOWNGRADING_RETRY - + "\n" - + "@consistency=THREE\n" - + "SELECT * FROM zeppelin.artists LIMIT 1;"; - - // When + //Given + String statement = "@retryPolicy=" + interpreter.LOGGING_DOWNGRADING_RETRY + "\n" + + "@consistency=THREE\n" + + "SELECT * FROM zeppelin.artists LIMIT 1;"; + + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); } @Test public void should_execute_statement_with_request_timeout() throws Exception { - // Given - String statement = "@requestTimeOut=10000000\n" + "SELECT * FROM zeppelin.artists;"; + //Given + String statement = "@requestTimeOut=10000000\n" + + "SELECT * FROM zeppelin.artists;"; - // When + //When final InterpreterResult actual = interpreter.interpret(statement, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); } @Test public void should_execute_prepared_and_bound_statements() throws Exception { - // Given - String queries = - "@prepare[ps]=INSERT INTO zeppelin.prepared(key,val) VALUES(?,?)\n" - + "@prepare[select]=SELECT * FROM zeppelin.prepared WHERE key=:key\n" - + "@bind[ps]='myKey','myValue'\n" - + "@bind[select]='myKey'"; - - // When + //Given + String queries = "@prepare[ps]=INSERT INTO zeppelin.prepared(key,val) VALUES(?,?)\n" + + "@prepare[select]=SELECT * FROM zeppelin.prepared WHERE key=:key\n" + + "@bind[ps]='myKey','myValue'\n" + + "@bind[select]='myKey'"; + + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()).isEqualTo("key\tval\n" + "myKey\tmyValue\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("key\tval\n" + + "myKey\tmyValue\n"); } @Test public void should_execute_bound_statement() throws Exception { - // Given - String queries = - "@prepare[users_insert]=INSERT INTO zeppelin.users" - + "(login,firstname,lastname,addresses,location)" - + "VALUES(:login,:fn,:ln,:addresses,:loc)\n" - + "@bind[users_insert]='jdoe','John','DOE'," - + "{street_number: 3, street_name: 'Beverly Hills Bld', zip_code: 90209," - + " country: 'USA', extra_info: ['Right on the hills','Next to the post box']," - + " phone_numbers: {'home': 2016778524, 'office': 2015790847}}," - + "('USA', 90209, 'Beverly Hills')\n" - + "SELECT * FROM zeppelin.users WHERE login='jdoe';"; - // When + //Given + String queries = "@prepare[users_insert]=INSERT INTO zeppelin.users" + + "(login,firstname,lastname,addresses,location)" + + "VALUES(:login,:fn,:ln,:addresses,:loc)\n" + + "@bind[users_insert]='jdoe','John','DOE'," + + "{street_number: 3, street_name: 'Beverly Hills Bld', zip_code: 90209," + + " country: 'USA', extra_info: ['Right on the hills','Next to the post box']," + + " phone_numbers: {'home': 2016778524, 'office': 2015790847}}," + + "('USA', 90209, 'Beverly Hills')\n" + + "SELECT * FROM zeppelin.users WHERE login='jdoe';"; + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo( - "login\taddresses\tage\tdeceased\tfirstname\tlast_update\tlastname\tlocation\n" - + "jdoe\t" - + "{street_number:3,street_name:'Beverly Hills Bld',zip_code:90209," - + "country:'USA',extra_info:['Right on the hills','Next to the post box']," - + "phone_numbers:{'office':2015790847,'home':2016778524}}\tnull\t" - + "null\t" - + "John\t" - + "null\t" - + "DOE\t" - + "('USA',90209,'Beverly Hills')\n"); + assertThat(actual.message().get(0).getData()).isEqualTo( + "login\taddresses\tage\tdeceased\tfirstname\tlast_update\tlastname\tlocation\n" + + "jdoe\t" + + "{street_number:3,street_name:'Beverly Hills Bld',zip_code:90209," + + "country:'USA',extra_info:['Right on the hills','Next to the post box']," + + "phone_numbers:{'office':2015790847,'home':2016778524}}\tnull\t" + + "null\t" + + "John\t" + + "null\t" + + "DOE\t" + + "('USA',90209,'Beverly Hills')\n"); } @Test public void should_exception_when_executing_unknown_bound_statement() throws Exception { - // Given + //Given String queries = "@bind[select_users]='jdoe'"; - // When + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()) - .isEqualTo( - "The statement 'select_users' can not be bound to values. " - + "Are you sure you did prepare it with @prepare[select_users] ?"); + .isEqualTo("The statement 'select_users' can not be bound to values. " + + "Are you sure you did prepare it with @prepare[select_users] ?"); } @Test public void should_extract_variable_from_statement() throws Exception { - // Given + //Given AngularObjectRegistry angularObjectRegistry = new AngularObjectRegistry("cassandra", null); when(intrContext.getAngularObjectRegistry()).thenReturn(angularObjectRegistry); when(intrContext.getGui().input("login", "hsue")).thenReturn("hsue"); when(intrContext.getGui().input("age", "27")).thenReturn("27"); - String queries = - "@prepare[test_insert_with_variable]=" - + "INSERT INTO zeppelin.users(login,firstname,lastname,age) VALUES(?,?,?,?)\n" - + "@bind[test_insert_with_variable]='{{login=hsue}}','Helen','SUE',{{age=27}}\n" - + "SELECT firstname,lastname,age FROM zeppelin.users WHERE login='hsue';"; - // When + String queries = "@prepare[test_insert_with_variable]=" + + "INSERT INTO zeppelin.users(login,firstname,lastname,age) VALUES(?,?,?,?)\n" + + "@bind[test_insert_with_variable]='{{login=hsue}}','Helen','SUE',{{age=27}}\n" + + "SELECT firstname,lastname,age FROM zeppelin.users WHERE login='hsue';"; + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo("firstname\tlastname\tage\n" + "Helen\tSUE\t27\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("firstname\tlastname\tage\n" + + "Helen\tSUE\t27\n"); } @Test public void should_just_prepare_statement() throws Exception { - // Given - String queries = - "@prepare[just_prepare]=SELECT name,country,styles " + "FROM zeppelin.artists LIMIT 3"; - final String expected = reformatHtml(readTestResource("/scalate/NoResult.html")); + //Given + String queries = "@prepare[just_prepare]=SELECT name,country,styles " + + "FROM zeppelin.artists LIMIT 3"; + final String expected = reformatHtml( + readTestResource("/scalate/NoResult.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_execute_bound_statement_with_no_bound_value() throws Exception { - // Given - String queries = - "@prepare[select_no_bound_value]=SELECT name,country,styles " - + "FROM zeppelin.artists LIMIT 3\n" - + "@bind[select_no_bound_value]"; + //Given + String queries = "@prepare[select_no_bound_value]=SELECT name,country,styles " + + "FROM zeppelin.artists LIMIT 3\n" + + "@bind[select_no_bound_value]"; - // When + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo( - "name\tcountry\tstyles\n" - + "Bogdan Raczynski\tPoland\t[Dance, Electro]\n" - + "Krishna Das\tUSA\t[Unknown]\n" - + "Sheryl Crow\tUSA\t[Classic, Rock, Country, Blues, Pop, Folk]\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("name\tcountry\tstyles\n" + + "Bogdan Raczynski\tPoland\t[Dance, Electro]\n" + + "Krishna Das\tUSA\t[Unknown]\n" + + "Sheryl Crow\tUSA\t[Classic, Rock, Country, Blues, Pop, Folk]\n"); } @Test public void should_parse_date_value() throws Exception { - // Given - String queries = - "@prepare[parse_date]=INSERT INTO zeppelin.users(login,last_update) " - + "VALUES(?,?)\n" - + "@bind[parse_date]='last_update','2015-07-30 12:00:01'\n" - + "SELECT last_update FROM zeppelin.users WHERE login='last_update';"; - // When + //Given + String queries = "@prepare[parse_date]=INSERT INTO zeppelin.users(login,last_update) " + + "VALUES(?,?)\n" + + "@bind[parse_date]='last_update','2015-07-30 12:00:01'\n" + + "SELECT last_update FROM zeppelin.users WHERE login='last_update';"; + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()).contains("last_update\n" + "Thu Jul 30 12:00:01"); + assertThat(actual.message().get(0).getData()).contains("last_update\n" + + "Thu Jul 30 12:00:01"); } @Test public void should_bind_null_value() throws Exception { - // Given - String queries = - "@prepare[bind_null]=INSERT INTO zeppelin.users(login,firstname,lastname) " - + "VALUES(?,?,?)\n" - + "@bind[bind_null]='bind_null',null,'NULL'\n" - + "SELECT firstname,lastname FROM zeppelin.users WHERE login='bind_null';"; - // When + //Given + String queries = "@prepare[bind_null]=INSERT INTO zeppelin.users(login,firstname,lastname) " + + "VALUES(?,?,?)\n" + + "@bind[bind_null]='bind_null',null,'NULL'\n" + + "SELECT firstname,lastname FROM zeppelin.users WHERE login='bind_null';"; + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo("firstname\tlastname\n" + "null\tNULL\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("firstname\tlastname\n" + + "null\tNULL\n"); } @Test public void should_bind_boolean_value() throws Exception { - // Given - String queries = - "@prepare[bind_boolean]=INSERT INTO zeppelin.users(login,deceased) " - + "VALUES(?,?)\n" - + "@bind[bind_boolean]='bind_bool',false\n" - + "SELECT login,deceased FROM zeppelin.users WHERE login='bind_bool';"; - // When + //Given + String queries = "@prepare[bind_boolean]=INSERT INTO zeppelin.users(login,deceased) " + + "VALUES(?,?)\n" + + "@bind[bind_boolean]='bind_bool',false\n" + + "SELECT login,deceased FROM zeppelin.users WHERE login='bind_bool';"; + //When final InterpreterResult actual = interpreter.interpret(queries, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); - assertThat(actual.message().get(0).getData()) - .isEqualTo("login\tdeceased\n" + "bind_bool\tfalse\n"); + assertThat(actual.message().get(0).getData()).isEqualTo("login\tdeceased\n" + + "bind_bool\tfalse\n"); } @Test public void should_fail_when_executing_a_removed_prepared_statement() throws Exception { - // Given - String prepareFirst = - "@prepare[to_be_removed]=INSERT INTO zeppelin.users(login,deceased) " + "VALUES(?,?)"; + //Given + String prepareFirst = "@prepare[to_be_removed]=INSERT INTO zeppelin.users(login,deceased) " + + "VALUES(?,?)"; interpreter.interpret(prepareFirst, intrContext); - String removePrepared = "@remove_prepare[to_be_removed]\n" + "@bind[to_be_removed]='bind_bool'"; + String removePrepared = "@remove_prepare[to_be_removed]\n" + + "@bind[to_be_removed]='bind_bool'"; - // When + //When final InterpreterResult actual = interpreter.interpret(removePrepared, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); - assertThat(actual.message().get(0).getData()) - .isEqualTo( - "The statement 'to_be_removed' can " - + "not be bound to values. Are you sure you did prepare it with " - + "@prepare[to_be_removed] ?"); + assertThat(actual.message().get(0).getData()).isEqualTo("The statement 'to_be_removed' can " + + "not be bound to values. Are you sure you did prepare it with " + + "@prepare[to_be_removed] ?"); } @Test public void should_display_statistics_for_non_select_statement() throws Exception { - // Given + //Given String query = "USE zeppelin;\nCREATE TABLE IF NOT EXISTS no_select(id int PRIMARY KEY);"; - final String rawResult = - reformatHtml(readTestResource("/scalate/NoResultWithExecutionInfo.html")); + final String rawResult = reformatHtml(readTestResource( + "/scalate/NoResultWithExecutionInfo.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); final Cluster cluster = session.getCluster(); final int port = cluster.getConfiguration().getProtocolOptions().getPort(); - final String address = - cluster - .getMetadata() - .getAllHosts() - .iterator() - .next() - .getAddress() - .getHostAddress() - .replaceAll("/", "") - .replaceAll("\\[", "") - .replaceAll("\\]", ""); - // Then - final String expected = - rawResult - .replaceAll("TRIED_HOSTS", address + ":" + port) + final String address = cluster.getMetadata().getAllHosts().iterator().next() + .getAddress().getHostAddress() + .replaceAll("/", "").replaceAll("\\[", "").replaceAll("\\]", ""); + //Then + final String expected = rawResult.replaceAll("TRIED_HOSTS", address + ":" + port) .replaceAll("QUERIED_HOSTS", address + ":" + port); assertThat(actual.code()).isEqualTo(Code.SUCCESS); @@ -573,225 +552,228 @@ public class CassandraInterpreterTest { @Test public void should_error_and_display_stack_trace() throws Exception { - // Given - String query = "@consistency=THREE\n" + "SELECT * FROM zeppelin.users LIMIT 3;"; - // When + //Given + String query = "@consistency=THREE\n" + + "SELECT * FROM zeppelin.users LIMIT 3;"; + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()).contains("All host(s) tried for query failed"); } @Test public void should_describe_cluster() throws Exception { - // Given + //Given String query = "DESCRIBE CLUSTER;"; - final String expected = reformatHtml(readTestResource("/scalate/DescribeCluster.html")); + final String expected = reformatHtml( + readTestResource("/scalate/DescribeCluster.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_describe_keyspaces() throws Exception { - // Given + //Given String query = "DESCRIBE KEYSPACES;"; - final String expected = reformatHtml(readTestResource("/scalate/DescribeKeyspaces.html")); + final String expected = reformatHtml( + readTestResource("/scalate/DescribeKeyspaces.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_describe_keyspace() throws Exception { - // Given + //Given String query = "DESCRIBE KEYSPACE live_data;"; - final String expected = - reformatHtml(readTestResource("/scalate/DescribeKeyspace_live_data.html")); + final String expected = reformatHtml( + readTestResource("/scalate/DescribeKeyspace_live_data.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test @Ignore - // TODO(n.a.) activate test when using Java 8 and C* 3.x + //TODO(n.a.) activate test when using Java 8 and C* 3.x public void should_describe_function() throws Exception { - // Given + //Given Properties properties = new Properties(); properties.setProperty(CASSANDRA_HOSTS, "127.0.0.1"); - properties.setProperty(CASSANDRA_PORT, "9042"); + properties.setProperty(CASSANDRA_PORT, "9042"); Interpreter interpreter = new CassandraInterpreter(properties); interpreter.open(); - String createFunction = - "CREATE FUNCTION zeppelin.maxof(val1 int,val2 int) " - + "RETURNS NULL ON NULL INPUT " - + "RETURNS int " - + "LANGUAGE java " - + "AS $$" - + " return Math.max(val1, val2);\n" - + "$$;"; + String createFunction = "CREATE FUNCTION zeppelin.maxof(val1 int,val2 int) " + + "RETURNS NULL ON NULL INPUT " + + "RETURNS int " + + "LANGUAGE java " + + "AS $$" + + " return Math.max(val1, val2);\n" + + "$$;"; interpreter.interpret(createFunction, intrContext); String query = "DESCRIBE FUNCTION zeppelin.maxOf;"; - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(actual.message()).isEqualTo("xxxxx"); } @Test @Ignore - // TODO(n.a.) activate test when using Java 8 and C* 3.x + //TODO(n.a.) activate test when using Java 8 and C* 3.x public void should_describe_aggregate() throws Exception { - // Given + //Given Properties properties = new Properties(); properties.setProperty(CASSANDRA_HOSTS, "127.0.0.1"); - properties.setProperty(CASSANDRA_PORT, "9042"); + properties.setProperty(CASSANDRA_PORT, "9042"); Interpreter interpreter = new CassandraInterpreter(properties); interpreter.open(); final String query = "DESCRIBE AGGREGATES;"; - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); } @Test @Ignore - // TODO(n.a.) activate test when using Java 8 and C* 3.x + //TODO(n.a.) activate test when using Java 8 and C* 3.x public void should_describe_materialized_view() throws Exception { - // Given + //Given Properties properties = new Properties(); properties.setProperty(CASSANDRA_HOSTS, "127.0.0.1"); - properties.setProperty(CASSANDRA_PORT, "9042"); + properties.setProperty(CASSANDRA_PORT, "9042"); Interpreter interpreter = new CassandraInterpreter(properties); interpreter.open(); final String query = "DESCRIBE MATERIALIZED VIEWS;"; - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); } @Test public void should_describe_table() throws Exception { - // Given + //Given String query = "DESCRIBE TABLE live_data.complex_table;"; - final String expected = - reformatHtml(readTestResource("/scalate/DescribeTable_live_data_complex_table.html")); + final String expected = reformatHtml( + readTestResource("/scalate/DescribeTable_live_data_complex_table.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_describe_udt() throws Exception { - // Given + //Given String query = "DESCRIBE TYPE live_data.address;"; - final String expected = - reformatHtml(readTestResource("/scalate/DescribeType_live_data_address.html")); + final String expected = reformatHtml( + readTestResource("/scalate/DescribeType_live_data_address.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_describe_udt_withing_logged_in_keyspace() throws Exception { - // Given - String query = "USE live_data;\n" + "DESCRIBE TYPE address;"; - final String expected = - reformatHtml( - readTestResource( - "/scalate/DescribeType_live_data_address_within_current_keyspace.html")); - - // When + //Given + String query = "USE live_data;\n" + + "DESCRIBE TYPE address;"; + final String expected = reformatHtml(readTestResource( + "/scalate/DescribeType_live_data_address_within_current_keyspace.html")); + + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } @Test public void should_error_describing_non_existing_table() throws Exception { - // Given - String query = "USE system;\n" + "DESCRIBE TABLE complex_table;"; + //Given + String query = "USE system;\n" + + "DESCRIBE TABLE complex_table;"; - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()) - .contains("Cannot find table system.complex_table"); + .contains("Cannot find table system.complex_table"); } @Test public void should_error_describing_non_existing_udt() throws Exception { - // Given - String query = "USE system;\n" + "DESCRIBE TYPE address;"; + //Given + String query = "USE system;\n" + + "DESCRIBE TYPE address;"; - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.ERROR); assertThat(actual.message().get(0).getData()).contains("Cannot find type system.address"); } @Test public void should_show_help() throws Exception { - // Given + //Given String query = "HELP;"; final String expected = reformatHtml(readTestResource("/scalate/Help.html")); - // When + //When final InterpreterResult actual = interpreter.interpret(query, intrContext); - // Then + //Then assertThat(actual.code()).isEqualTo(Code.SUCCESS); assertThat(reformatHtml(actual.message().get(0).getData())).isEqualTo(expected); } private static String reformatHtml(String rawHtml) { - return rawHtml - .replaceAll("\\s*\n\\s*", "") - .replaceAll(">\\s+<", "><") - .replaceAll("(?s)data-target=\"#[a-f0-9-]+(?:_asCQL|_indices_asCQL)?\"", "") - .replaceAll("(?s)id=\"[a-f0-9-]+(?:_asCQL|_indices_asCQL)?\"", "") - .trim(); + return rawHtml + .replaceAll("\\s*\n\\s*", "") + .replaceAll(">\\s+<", "><") + .replaceAll("(?s)data-target=\"#[a-f0-9-]+(?:_asCQL|_indices_asCQL)?\"", "") + .replaceAll("(?s)id=\"[a-f0-9-]+(?:_asCQL|_indices_asCQL)?\"", "") + .trim(); } private static String readTestResource(String testResource) { @@ -804,7 +786,7 @@ public class CassandraInterpreterTest { builder.append(line).append("\n"); } } catch (Exception ex) { - throw new RuntimeException(ex); + throw new RuntimeException(ex); } return builder.toString();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/cassandra/src/test/java/org/apache/zeppelin/cassandra/InterpreterLogicTest.java ---------------------------------------------------------------------- diff --git a/cassandra/src/test/java/org/apache/zeppelin/cassandra/InterpreterLogicTest.java b/cassandra/src/test/java/org/apache/zeppelin/cassandra/InterpreterLogicTest.java index 71db121..e096a0c 100644 --- a/cassandra/src/test/java/org/apache/zeppelin/cassandra/InterpreterLogicTest.java +++ b/cassandra/src/test/java/org/apache/zeppelin/cassandra/InterpreterLogicTest.java @@ -16,13 +16,6 @@ */ package org.apache.zeppelin.cassandra; -import static com.datastax.driver.core.BatchStatement.Type.UNLOGGED; -import static com.datastax.driver.core.ConsistencyLevel.ALL; -import static com.datastax.driver.core.ConsistencyLevel.LOCAL_SERIAL; -import static com.datastax.driver.core.ConsistencyLevel.ONE; -import static com.datastax.driver.core.ConsistencyLevel.QUORUM; -import static com.datastax.driver.core.ConsistencyLevel.SERIAL; -import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; @@ -31,16 +24,39 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import com.datastax.driver.core.BatchStatement; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.SimpleStatement; -import com.datastax.driver.core.Statement; +import static java.util.Arrays.asList; + +import static com.datastax.driver.core.BatchStatement.Type.UNLOGGED; +import static com.datastax.driver.core.ConsistencyLevel.ALL; +import static com.datastax.driver.core.ConsistencyLevel.LOCAL_SERIAL; +import static com.datastax.driver.core.ConsistencyLevel.ONE; +import static com.datastax.driver.core.ConsistencyLevel.QUORUM; +import static com.datastax.driver.core.ConsistencyLevel.SERIAL; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; + +import com.datastax.driver.core.BatchStatement; +import com.datastax.driver.core.ConsistencyLevel; +import com.datastax.driver.core.Session; +import com.datastax.driver.core.SimpleStatement; +import com.datastax.driver.core.Statement; + +import scala.Option; + import org.apache.zeppelin.cassandra.TextBlockHierarchy.AnyBlock; import org.apache.zeppelin.cassandra.TextBlockHierarchy.Consistency; import org.apache.zeppelin.cassandra.TextBlockHierarchy.DowngradingRetryPolicy$; @@ -56,90 +72,80 @@ import org.apache.zeppelin.display.GUI; import org.apache.zeppelin.display.ui.OptionInput.ParamOption; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import scala.Option; @RunWith(MockitoJUnitRunner.class) public class InterpreterLogicTest { - @Rule public ExpectedException expectedException = ExpectedException.none(); + @Rule + public ExpectedException expectedException = ExpectedException.none(); @Mock(answer = Answers.RETURNS_DEEP_STUBS) private InterpreterContext intrContext; - @Mock private Session session; + @Mock + private Session session; final InterpreterLogic helper = new InterpreterLogic(session); - @Captor ArgumentCaptor<ParamOption[]> optionsCaptor; + @Captor + ArgumentCaptor<ParamOption[]> optionsCaptor; @Test public void should_parse_input_string_block() throws Exception { - // Given + //Given String input = "SELECT * FROM users LIMIT 10;"; - // When + //When final List<AnyBlock> anyBlocks = this.<AnyBlock>toJavaList(helper.parseInput(input)); - // Then + //Then assertThat(anyBlocks).hasSize(1); assertThat(anyBlocks.get(0)).isInstanceOf(SimpleStm.class); } @Test public void should_exception_while_parsing_input() throws Exception { - // Given + //Given String input = "SELECT * FROM users LIMIT 10"; - // When + //When expectedException.expect(InterpreterException.class); - expectedException.expectMessage( - "Error parsing input:\n" - + "\t'SELECT * FROM users LIMIT 10'\n" - + "Did you forget to add ; (semi-colon) at the end of each CQL statement ?"); + expectedException.expectMessage("Error parsing input:\n" + + "\t'SELECT * FROM users LIMIT 10'\n" + + "Did you forget to add ; (semi-colon) at the end of each CQL statement ?"); helper.parseInput(input); } @Test public void should_extract_variable_and_default_value() throws Exception { - // Given + //Given AngularObjectRegistry angularObjectRegistry = new AngularObjectRegistry("cassandra", null); when(intrContext.getAngularObjectRegistry()).thenReturn(angularObjectRegistry); when(intrContext.getGui().input("table", "zeppelin.demo")).thenReturn("zeppelin.demo"); when(intrContext.getGui().input("id", "'John'")).thenReturn("'John'"); - // When - final String actual = - helper.maybeExtractVariables( + //When + final String actual = helper.maybeExtractVariables( "SELECT * FROM {{table=zeppelin.demo}} WHERE id={{id='John'}}", intrContext); - // Then + //Then assertThat(actual).isEqualTo("SELECT * FROM zeppelin.demo WHERE id='John'"); } @Test public void should_extract_variable_and_choices() throws Exception { - // Given + //Given AngularObjectRegistry angularObjectRegistry = new AngularObjectRegistry("cassandra", null); when(intrContext.getAngularObjectRegistry()).thenReturn(angularObjectRegistry); when(intrContext.getGui().select(eq("name"), eq("'Paul'"), optionsCaptor.capture())) - .thenReturn("'Jack'"); + .thenReturn("'Jack'"); - // When - final String actual = - helper.maybeExtractVariables( + //When + final String actual = helper.maybeExtractVariables( "SELECT * FROM zeppelin.artists WHERE name={{name='Paul'|'Jack'|'Smith'}}", intrContext); - // Then + //Then assertThat(actual).isEqualTo("SELECT * FROM zeppelin.artists WHERE name='Jack'"); final List<ParamOption> paramOptions = asList(optionsCaptor.getValue()); assertThat(paramOptions.get(0).getValue()).isEqualTo("'Paul'"); @@ -149,137 +155,131 @@ public class InterpreterLogicTest { @Test public void should_extract_no_variable() throws Exception { - // Given + //Given GUI gui = mock(GUI.class); when(intrContext.getGui()).thenReturn(gui); - // When + //When final String actual = helper.maybeExtractVariables("SELECT * FROM zeppelin.demo", intrContext); - // Then + //Then verifyZeroInteractions(gui); assertThat(actual).isEqualTo("SELECT * FROM zeppelin.demo"); } @Test public void should_extract_variable_from_angular_object_registry() throws Exception { - // Given + //Given AngularObjectRegistry angularObjectRegistry = new AngularObjectRegistry("cassandra", null); angularObjectRegistry.add("id", "from_angular_registry", "noteId", "paragraphId"); when(intrContext.getAngularObjectRegistry()).thenReturn(angularObjectRegistry); when(intrContext.getNoteId()).thenReturn("noteId"); when(intrContext.getParagraphId()).thenReturn("paragraphId"); - // When - final String actual = - helper.maybeExtractVariables( + //When + final String actual = helper.maybeExtractVariables( "SELECT * FROM zeppelin.demo WHERE id='{{id=John}}'", intrContext); - // Then + //Then assertThat(actual).isEqualTo("SELECT * FROM zeppelin.demo WHERE id='from_angular_registry'"); verify(intrContext, never()).getGui(); } @Test public void should_error_if_incorrect_variable_definition() throws Exception { - // Given + //Given - // When + //When expectedException.expect(ParsingException.class); - expectedException.expectMessage( - "Invalid bound variable definition for " - + "'{{table?zeppelin.demo}}' in 'SELECT * FROM {{table?zeppelin.demo}} " - + "WHERE id={{id='John'}}'. It should be of form 'variable=defaultValue'"); - - // Then - helper.maybeExtractVariables( - "SELECT * FROM {{table?zeppelin.demo}} WHERE id={{id='John'}}", intrContext); + expectedException.expectMessage("Invalid bound variable definition for " + + "'{{table?zeppelin.demo}}' in 'SELECT * FROM {{table?zeppelin.demo}} " + + "WHERE id={{id='John'}}'. It should be of form 'variable=defaultValue'"); + + //Then + helper.maybeExtractVariables("SELECT * FROM {{table?zeppelin.demo}} WHERE id={{id='John'}}", + intrContext); } @Test public void should_extract_consistency_option() throws Exception { - // Given - List<QueryParameters> options = - Arrays.<QueryParameters>asList(new Consistency(ALL), new Consistency(ONE)); + //Given + List<QueryParameters> options = Arrays.<QueryParameters>asList(new Consistency(ALL), + new Consistency(ONE)); - // When + //When final CassandraQueryOptions actual = helper.extractQueryOptions(toScalaList(options)); - // Then + //Then assertThat(actual.consistency().get()).isEqualTo(ALL); } @Test public void should_extract_serial_consistency_option() throws Exception { - // Given - List<QueryParameters> options = - Arrays.<QueryParameters>asList( - new SerialConsistency(SERIAL), new SerialConsistency(LOCAL_SERIAL)); + //Given + List<QueryParameters> options = Arrays.<QueryParameters>asList(new SerialConsistency(SERIAL), + new SerialConsistency(LOCAL_SERIAL)); - // When + //When final CassandraQueryOptions actual = helper.extractQueryOptions(toScalaList(options)); - // Then + //Then assertThat(actual.serialConsistency().get()).isEqualTo(SERIAL); } @Test public void should_extract_timestamp_option() throws Exception { - // Given - List<QueryParameters> options = - Arrays.<QueryParameters>asList(new Timestamp(123L), new Timestamp(456L)); + //Given + List<QueryParameters> options = Arrays.<QueryParameters>asList(new Timestamp(123L), + new Timestamp(456L)); - // When + //When final CassandraQueryOptions actual = helper.extractQueryOptions(toScalaList(options)); - // Then + //Then assertThat(actual.timestamp().get()).isEqualTo(123L); } @Test public void should_extract_retry_policy_option() throws Exception { - // Given - List<QueryParameters> options = - Arrays.<QueryParameters>asList( - DowngradingRetryPolicy$.MODULE$, LoggingDefaultRetryPolicy$.MODULE$); + //Given + List<QueryParameters> options = Arrays.<QueryParameters>asList(DowngradingRetryPolicy$.MODULE$, + LoggingDefaultRetryPolicy$.MODULE$); - // When + //When final CassandraQueryOptions actual = helper.extractQueryOptions(toScalaList(options)); - // Then + //Then assertThat(actual.retryPolicy().get()).isSameAs(DowngradingRetryPolicy$.MODULE$); } @Test public void should_extract_request_timeout_option() throws Exception { - // Given + //Given List<QueryParameters> options = Arrays.<QueryParameters>asList(new RequestTimeOut(100)); - // When + //When final CassandraQueryOptions actual = helper.extractQueryOptions(toScalaList(options)); - // Then + //Then assertThat(actual.requestTimeOut().get()).isEqualTo(100); } @Test public void should_generate_simple_statement() throws Exception { - // Given + //Given String input = "SELECT * FROM users LIMIT 10;"; - CassandraQueryOptions options = - new CassandraQueryOptions( - Option.apply(QUORUM), + CassandraQueryOptions options = new CassandraQueryOptions(Option.apply(QUORUM), Option.<ConsistencyLevel>empty(), Option.empty(), Option.<RetryPolicy>empty(), Option.empty(), Option.empty()); - // When - final SimpleStatement actual = - helper.generateSimpleStatement(new SimpleStm(input), options, intrContext); + //When + final SimpleStatement actual = helper.generateSimpleStatement(new SimpleStm(input), options, + intrContext); - // Then + //Then assertThat(actual).isNotNull(); assertThat(actual.getQueryString()).isEqualTo("SELECT * FROM users LIMIT 10;"); assertThat(actual.getConsistencyLevel()).isSameAs(QUORUM); @@ -287,24 +287,22 @@ public class InterpreterLogicTest { @Test public void should_generate_batch_statement() throws Exception { - // Given + //Given Statement st1 = new SimpleStatement("SELECT * FROM users LIMIT 10;"); Statement st2 = new SimpleStatement("INSERT INTO users(id) VALUES(10);"); Statement st3 = new SimpleStatement("UPDATE users SET name = 'John DOE' WHERE id=10;"); - CassandraQueryOptions options = - new CassandraQueryOptions( - Option.apply(QUORUM), + CassandraQueryOptions options = new CassandraQueryOptions(Option.apply(QUORUM), Option.<ConsistencyLevel>empty(), Option.empty(), Option.<RetryPolicy>empty(), Option.empty(), Option.empty()); - // When - BatchStatement actual = - helper.generateBatchStatement(UNLOGGED, options, toScalaList(asList(st1, st2, st3))); + //When + BatchStatement actual = helper.generateBatchStatement(UNLOGGED, options, + toScalaList(asList(st1, st2, st3))); - // Then + //Then assertThat(actual).isNotNull(); final List<Statement> statements = new ArrayList<>(actual.getStatements()); assertThat(statements).hasSize(3); @@ -316,26 +314,26 @@ public class InterpreterLogicTest { @Test public void should_parse_bound_values() throws Exception { - // Given + //Given String bs = "'jdoe',32,'John DOE',null, true, '2014-06-12 34:00:34'"; - // When + //When final List<String> actual = this.<String>toJavaList(helper.parseBoundValues("ps", bs)); - // Then - assertThat(actual) - .containsExactly("'jdoe'", "32", "'John DOE'", "null", "true", "2014-06-12 34:00:34"); + //Then + assertThat(actual).containsExactly("'jdoe'", "32", "'John DOE'", + "null", "true", "2014-06-12 34:00:34"); } @Test public void should_parse_simple_date() throws Exception { - // Given + //Given String dateString = "2015-07-30 12:00:01"; - // When + //When final Date actual = helper.parseDate(dateString); - // Then + //Then Calendar calendar = Calendar.getInstance(); calendar.setTime(actual); @@ -349,13 +347,13 @@ public class InterpreterLogicTest { @Test public void should_parse_accurate_date() throws Exception { - // Given + //Given String dateString = "2015-07-30 12:00:01.123"; - // When + //When final Date actual = helper.parseDate(dateString); - // Then + //Then Calendar calendar = Calendar.getInstance(); calendar.setTime(actual); @@ -368,11 +366,11 @@ public class InterpreterLogicTest { assertThat(calendar.get(Calendar.MILLISECOND)).isEqualTo(123); } - private <A> scala.collection.immutable.List<A> toScalaList(java.util.List<A> list) { + private <A> scala.collection.immutable.List<A> toScalaList(java.util.List<A> list) { return scala.collection.JavaConversions.collectionAsScalaIterable(list).toList(); } - private <A> java.util.List<A> toJavaList(scala.collection.immutable.List<A> list) { + private <A> java.util.List<A> toJavaList(scala.collection.immutable.List<A> list){ return scala.collection.JavaConversions.seqAsJavaList(list); } } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/docs/development/contribution/how_to_contribute_code.md ---------------------------------------------------------------------- diff --git a/docs/development/contribution/how_to_contribute_code.md b/docs/development/contribution/how_to_contribute_code.md index 05963f1..e71326e 100644 --- a/docs/development/contribution/how_to_contribute_code.md +++ b/docs/development/contribution/how_to_contribute_code.md @@ -37,10 +37,6 @@ Since Zeppelin uses Git for it's SCM system, you need git client installed in yo You are free to use whatever IDE you prefer, or your favorite command line editor. -#### Code Style - -We decided to use `google-java-format`. You can install this formatter from [https://github.com/google/google-java-format](https://github.com/google/google-java-format). And the build script also contains `fmt-maven-plugin` to verify the formats of files. You can check `mvn validate` and fix wrong formats by running `mvn fmt:format` manually. - #### Build Tools To build the code, install http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/pom.xml ---------------------------------------------------------------------- diff --git a/elasticsearch/pom.xml b/elasticsearch/pom.xml index f80cbc5..4e4021f 100644 --- a/elasticsearch/pom.xml +++ b/elasticsearch/pom.xml @@ -101,6 +101,13 @@ <plugin> <artifactId>maven-resources-plugin</artifactId> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <configuration> + <skip>false</skip> + </configuration> + </plugin> </plugins> </build> http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java index 3c58b50..45b37c4 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreter.java @@ -17,10 +17,23 @@ package org.apache.zeppelin.elasticsearch; -import com.github.wnameless.json.flattener.JsonFlattener; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; + +import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.search.aggregations.Aggregation; +import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; +import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation; +import org.elasticsearch.search.aggregations.metrics.InternalMetricsAggregation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -35,7 +48,9 @@ import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang3.StringUtils; + +import com.github.wnameless.json.flattener.JsonFlattener; + import org.apache.zeppelin.completer.CompletionType; import org.apache.zeppelin.elasticsearch.action.ActionResponse; import org.apache.zeppelin.elasticsearch.action.AggWrapper; @@ -47,43 +62,33 @@ 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; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentHelper; -import org.elasticsearch.search.aggregations.Aggregation; -import org.elasticsearch.search.aggregations.Aggregations; -import org.elasticsearch.search.aggregations.InternalMultiBucketAggregation; -import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation; -import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation; -import org.elasticsearch.search.aggregations.metrics.InternalMetricsAggregation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** Elasticsearch Interpreter for Zeppelin. */ +/** + * Elasticsearch Interpreter for Zeppelin. + */ public class ElasticsearchInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(ElasticsearchInterpreter.class); - private static final String HELP = - "Elasticsearch interpreter:\n" - + "General format: <command> /<indices>/<types>/<id> <option> <JSON>\n" - + " - indices: list of indices separated by commas (depends on the command)\n" - + " - types: list of document types separated by commas (depends on the command)\n" - + "Commands:\n" - + " - search /indices/types <query>\n" - + " . indices and types can be omitted (at least, you have to provide '/')\n" - + " . a query is either a JSON-formatted query, nor a lucene query\n" - + " - size <value>\n" - + " . defines the size of the result set (default value is in the config)\n" - + " . if used, this command must be declared before a search command\n" - + " - count /indices/types <query>\n" - + " . same comments as for the search\n" - + " - get /index/type/id\n" - + " - delete /index/type/id\n" - + " - index /index/type/id <json-formatted document>\n" - + " . the id can be omitted, elasticsearch will generate one"; - - protected static final List<String> COMMANDS = - Arrays.asList("count", "delete", "get", "help", "index", "search"); + private static final String HELP = "Elasticsearch interpreter:\n" + + "General format: <command> /<indices>/<types>/<id> <option> <JSON>\n" + + " - indices: list of indices separated by commas (depends on the command)\n" + + " - types: list of document types separated by commas (depends on the command)\n" + + "Commands:\n" + + " - search /indices/types <query>\n" + + " . indices and types can be omitted (at least, you have to provide '/')\n" + + " . a query is either a JSON-formatted query, nor a lucene query\n" + + " - size <value>\n" + + " . defines the size of the result set (default value is in the config)\n" + + " . if used, this command must be declared before a search command\n" + + " - count /indices/types <query>\n" + + " . same comments as for the search\n" + + " - get /index/type/id\n" + + " - delete /index/type/id\n" + + " - index /index/type/id <json-formatted document>\n" + + " . the id can be omitted, elasticsearch will generate one"; + + protected static final List<String> COMMANDS = Arrays.asList( + "count", "delete", "get", "help", "index", "search"); private static final Pattern FIELD_NAME_PATTERN = Pattern.compile("\\[\\\\\"(.+)\\\\\"\\](.*)"); @@ -114,12 +119,8 @@ public class ElasticsearchInterpreter extends Interpreter { this.resultSize = Integer.parseInt(getProperty(ELASTICSEARCH_RESULT_SIZE)); } catch (final NumberFormatException e) { this.resultSize = 10; - logger.error( - "Unable to parse " - + ELASTICSEARCH_RESULT_SIZE - + " : " - + getProperty(ELASTICSEARCH_RESULT_SIZE), - e); + logger.error("Unable to parse " + ELASTICSEARCH_RESULT_SIZE + " : " + + getProperty(ELASTICSEARCH_RESULT_SIZE), e); } try { @@ -153,9 +154,8 @@ public class ElasticsearchInterpreter extends Interpreter { int currentResultSize = resultSize; if (elsClient == null) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, - "Problem with the Elasticsearch client, please check your configuration (host, port,...)"); + return new InterpreterResult(InterpreterResult.Code.ERROR, + "Problem with the Elasticsearch client, please check your configuration (host, port,...)"); } String[] items = StringUtils.split(cmd.trim(), " ", 3); @@ -171,7 +171,8 @@ public class ElasticsearchInterpreter extends Interpreter { final String[] lines = StringUtils.split(cmd.trim(), "\n", 2); if (lines.length < 2) { - return processHelp(InterpreterResult.Code.ERROR, "Size cmd must be followed by a search"); + return processHelp(InterpreterResult.Code.ERROR, + "Size cmd must be followed by a search"); } final String[] sizeLine = StringUtils.split(lines[0], " ", 2); @@ -228,8 +229,8 @@ public class ElasticsearchInterpreter extends Interpreter { } @Override - public List<InterpreterCompletion> completion( - String s, int i, InterpreterContext interpreterContext) { + public List<InterpreterCompletion> completion(String s, int i, + InterpreterContext interpreterContext) { final List suggestions = new ArrayList<>(); for (final String cmd : COMMANDS) { @@ -241,9 +242,9 @@ public class ElasticsearchInterpreter extends Interpreter { } private void addAngularObject(InterpreterContext interpreterContext, String prefix, Object obj) { - interpreterContext - .getAngularObjectRegistry() - .add(prefix + "_" + interpreterContext.getParagraphId().replace("-", "_"), obj, null, null); + interpreterContext.getAngularObjectRegistry().add( + prefix + "_" + interpreterContext.getParagraphId().replace("-", "_"), + obj, null, null); } private String[] getIndexTypeId(String[] urlItems) { @@ -255,11 +256,13 @@ public class ElasticsearchInterpreter extends Interpreter { final String type = urlItems[1]; final String id = StringUtils.join(Arrays.copyOfRange(urlItems, 2, urlItems.length), '/'); - if (StringUtils.isEmpty(index) || StringUtils.isEmpty(type) || StringUtils.isEmpty(id)) { + if (StringUtils.isEmpty(index) + || StringUtils.isEmpty(type) + || StringUtils.isEmpty(id)) { return null; } - return new String[] {index, type, id}; + return new String[] { index, type, id }; } private InterpreterResult processHelp(InterpreterResult.Code code, String additionalMessage) { @@ -284,8 +287,8 @@ public class ElasticsearchInterpreter extends Interpreter { final String[] indexTypeId = getIndexTypeId(urlItems); if (indexTypeId == null) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, "Bad URL (it should be /index/type/id)"); + return new InterpreterResult(InterpreterResult.Code.ERROR, + "Bad URL (it should be /index/type/id)"); } final ActionResponse response = elsClient.get(indexTypeId[0], indexTypeId[1], indexTypeId[2]); @@ -297,7 +300,9 @@ public class ElasticsearchInterpreter extends Interpreter { addAngularObject(interpreterContext, "get", json); return new InterpreterResult( - InterpreterResult.Code.SUCCESS, InterpreterResult.Type.TEXT, jsonStr); + InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.TEXT, + jsonStr); } return new InterpreterResult(InterpreterResult.Code.ERROR, "Document not found"); @@ -311,11 +316,10 @@ public class ElasticsearchInterpreter extends Interpreter { * @param interpreterContext Instance of the context * @return Result of the count request, it contains the total hits */ - private InterpreterResult processCount( - String[] urlItems, String data, InterpreterContext interpreterContext) { + private InterpreterResult processCount(String[] urlItems, String data, + InterpreterContext interpreterContext) { if (urlItems.length > 2) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, + return new InterpreterResult(InterpreterResult.Code.ERROR, "Bad URL (it should be /index1,index2,.../type1,type2,...)"); } @@ -324,7 +328,9 @@ public class ElasticsearchInterpreter extends Interpreter { addAngularObject(interpreterContext, "count", response.getTotalHits()); return new InterpreterResult( - InterpreterResult.Code.SUCCESS, InterpreterResult.Type.TEXT, "" + response.getTotalHits()); + InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.TEXT, + "" + response.getTotalHits()); } /** @@ -336,22 +342,18 @@ public class ElasticsearchInterpreter extends Interpreter { * @param interpreterContext Instance of the context * @return Result of the search request, it contains a tab-formatted string of the matching hits */ - private InterpreterResult processSearch( - String[] urlItems, String data, int size, InterpreterContext interpreterContext) { + private InterpreterResult processSearch(String[] urlItems, String data, int size, + InterpreterContext interpreterContext) { if (urlItems.length > 2) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, + return new InterpreterResult(InterpreterResult.Code.ERROR, "Bad URL (it should be /index1,index2,.../type1,type2,...)"); } final ActionResponse response = searchData(urlItems, data, size); - addAngularObject( - interpreterContext, - "search", - (response.getAggregations() != null && response.getAggregations().size() > 0) - ? response.getAggregations() - : response.getHits()); + addAngularObject(interpreterContext, "search", + (response.getAggregations() != null && response.getAggregations().size() > 0) ? + response.getAggregations() : response.getHits()); return buildResponseMessage(response); } @@ -365,15 +367,17 @@ public class ElasticsearchInterpreter extends Interpreter { */ private InterpreterResult processIndex(String[] urlItems, String data) { if (urlItems.length < 2 || urlItems.length > 3) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, "Bad URL (it should be /index/type or /index/type/id)"); + return new InterpreterResult(InterpreterResult.Code.ERROR, + "Bad URL (it should be /index/type or /index/type/id)"); } - final ActionResponse response = - elsClient.index(urlItems[0], urlItems[1], urlItems.length == 2 ? null : urlItems[2], data); + final ActionResponse response = elsClient.index( + urlItems[0], urlItems[1], urlItems.length == 2 ? null : urlItems[2], data); return new InterpreterResult( - InterpreterResult.Code.SUCCESS, InterpreterResult.Type.TEXT, response.getHit().getId()); + InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.TEXT, + response.getHit().getId()); } /** @@ -386,8 +390,8 @@ public class ElasticsearchInterpreter extends Interpreter { final String[] indexTypeId = getIndexTypeId(urlItems); if (indexTypeId == null) { - return new InterpreterResult( - InterpreterResult.Code.ERROR, "Bad URL (it should be /index/type/id)"); + return new InterpreterResult(InterpreterResult.Code.ERROR, + "Bad URL (it should be /index/type/id)"); } final ActionResponse response = @@ -395,7 +399,9 @@ public class ElasticsearchInterpreter extends Interpreter { if (response.isSucceeded()) { return new InterpreterResult( - InterpreterResult.Code.SUCCESS, InterpreterResult.Type.TEXT, response.getHit().getId()); + InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.TEXT, + response.getHit().getId()); } return new InterpreterResult(InterpreterResult.Code.ERROR, "Document not found"); @@ -445,7 +451,7 @@ public class ElasticsearchInterpreter extends Interpreter { final StringBuffer buffer = new StringBuffer(); final String[] keys = headerKeys.toArray(new String[0]); - for (final String key : keys) { + for (final String key: keys) { buffer.append("\t" + key); } buffer.deleteCharAt(0); @@ -453,7 +459,7 @@ public class ElasticsearchInterpreter extends Interpreter { for (final Map<String, Object> bucket : buckets) { buffer.append("\n"); - for (final String key : keys) { + for (final String key: keys) { buffer.append(bucket.get(key)).append("\t"); } buffer.deleteCharAt(buffer.length() - 1); @@ -473,7 +479,7 @@ public class ElasticsearchInterpreter extends Interpreter { final Set<String> headerKeys = new HashSet<>(); final List<Map<String, Object>> buckets = new LinkedList<>(); - for (final AggWrapper aggregation : aggregations) { + for (final AggWrapper aggregation: aggregations) { final Map<String, Object> bucketMap = JsonFlattener.flattenAsMap(aggregation.getResult()); headerKeys.addAll(bucketMap.keySet()); buckets.add(bucketMap); @@ -481,7 +487,7 @@ public class ElasticsearchInterpreter extends Interpreter { final StringBuffer buffer = new StringBuffer(); final String[] keys = headerKeys.toArray(new String[0]); - for (final String key : keys) { + for (final String key: keys) { buffer.append("\t" + key); } buffer.deleteCharAt(0); @@ -489,7 +495,7 @@ public class ElasticsearchInterpreter extends Interpreter { for (final Map<String, Object> bucket : buckets) { buffer.append("\n"); - for (final String key : keys) { + for (final String key: keys) { buffer.append(bucket.get(key)).append("\t"); } buffer.deleteCharAt(buffer.length() - 1); @@ -505,7 +511,7 @@ public class ElasticsearchInterpreter extends Interpreter { return ""; } - // First : get all the keys in order to build an ordered list of the values for each hit + //First : get all the keys in order to build an ordered list of the values for each hit // final List<Map<String, Object>> flattenHits = new LinkedList<>(); final Set<String> keys = new TreeSet<>(); @@ -520,8 +526,8 @@ public class ElasticsearchInterpreter extends Interpreter { final String fieldName = iter.next(); final Matcher fieldNameMatcher = FIELD_NAME_PATTERN.matcher(fieldName); if (fieldNameMatcher.matches()) { - flattenMap.put( - fieldNameMatcher.group(1) + fieldNameMatcher.group(2), flattenJsonMap.get(fieldName)); + flattenMap.put(fieldNameMatcher.group(1) + fieldNameMatcher.group(2), + flattenJsonMap.get(fieldName)); } else { flattenMap.put(fieldName, flattenJsonMap.get(fieldName)); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionException.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionException.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionException.java index 458fce3..6846d0a 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionException.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionException.java @@ -17,7 +17,9 @@ package org.apache.zeppelin.elasticsearch.action; -/** Runtime exception thrown when there is a problem during an action (search, get, ...). */ +/** + * Runtime exception thrown when there is a problem during an action (search, get, ...). + */ public class ActionException extends RuntimeException { public ActionException(String message) { http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionResponse.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionResponse.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionResponse.java index 0acb4c4..4141bce 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionResponse.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/ActionResponse.java @@ -20,7 +20,9 @@ package org.apache.zeppelin.elasticsearch.action; import java.util.LinkedList; import java.util.List; -/** Contains the result of an action (hits, aggregations, ...). */ +/** + * Contains the result of an action (hits, aggregations, ...). + */ public class ActionResponse { private boolean succeeded; @@ -28,6 +30,7 @@ public class ActionResponse { private final List<HitWrapper> hits = new LinkedList<>(); private final List<AggWrapper> aggregations = new LinkedList<>(); + public ActionResponse succeeded(boolean succeeded) { this.succeeded = succeeded; return this; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/AggWrapper.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/AggWrapper.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/AggWrapper.java index 1c0bd92..a3ed951 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/AggWrapper.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/AggWrapper.java @@ -17,13 +17,14 @@ package org.apache.zeppelin.elasticsearch.action; -/** Contains the result of an aggregation. */ +/** + * Contains the result of an aggregation. + */ public class AggWrapper { - /** Type of an aggregation (to know if there are buckets or not). */ - public enum AggregationType { - SIMPLE, - MULTI_BUCKETS - }; + /** + * Type of an aggregation (to know if there are buckets or not). + */ + public enum AggregationType { SIMPLE, MULTI_BUCKETS }; private final AggregationType type; private final String result; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/HitWrapper.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/HitWrapper.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/HitWrapper.java index 2175485..3be4514 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/HitWrapper.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/action/HitWrapper.java @@ -21,7 +21,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -/** Contains the data of a hit. */ +/** + * Contains the data of a hit. + */ public class HitWrapper { private final JsonParser parser = new JsonParser(); http://git-wip-us.apache.org/repos/asf/zeppelin/blob/0d746fa2/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/client/ElasticsearchClient.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/client/ElasticsearchClient.java b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/client/ElasticsearchClient.java index 36423ab..48e1980 100644 --- a/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/client/ElasticsearchClient.java +++ b/elasticsearch/src/main/java/org/apache/zeppelin/elasticsearch/client/ElasticsearchClient.java @@ -19,7 +19,9 @@ package org.apache.zeppelin.elasticsearch.client; import org.apache.zeppelin.elasticsearch.action.ActionResponse; -/** Interface that must be implemented by any kind of Elasticsearch client (transport, ...). */ +/** + * Interface that must be implemented by any kind of Elasticsearch client (transport, ...). + */ public interface ElasticsearchClient { ActionResponse get(String index, String type, String id);
