calcite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jh...@apache.org
Subject [1/8] incubator-calcite git commit: [CALCITE-840] Protocol buffer serialization over HTTP for Avatica Server (Josh Elser)
Date Thu, 17 Sep 2015 00:10:47 GMT
Repository: incubator-calcite
Updated Branches:
  refs/heads/master 6c81b869d -> cb7c213cd


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
new file mode 100644
index 0000000..5fad0c5
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/ProtobufTranslationImplTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.calcite.avatica.remote;
+
+import org.apache.calcite.avatica.AvaticaParameter;
+import org.apache.calcite.avatica.ColumnMetaData;
+import org.apache.calcite.avatica.ColumnMetaData.Rep;
+import org.apache.calcite.avatica.ConnectionPropertiesImpl;
+import org.apache.calcite.avatica.Meta;
+import org.apache.calcite.avatica.Meta.Frame;
+import org.apache.calcite.avatica.Meta.Signature;
+import org.apache.calcite.avatica.Meta.Style;
+import org.apache.calcite.avatica.MetaImpl;
+import org.apache.calcite.avatica.remote.Service.CatalogsRequest;
+import org.apache.calcite.avatica.remote.Service.CloseConnectionRequest;
+import org.apache.calcite.avatica.remote.Service.CloseStatementRequest;
+import org.apache.calcite.avatica.remote.Service.CloseStatementResponse;
+import org.apache.calcite.avatica.remote.Service.ColumnsRequest;
+import org.apache.calcite.avatica.remote.Service.ConnectionSyncRequest;
+import org.apache.calcite.avatica.remote.Service.ConnectionSyncResponse;
+import org.apache.calcite.avatica.remote.Service.CreateStatementRequest;
+import org.apache.calcite.avatica.remote.Service.CreateStatementResponse;
+import org.apache.calcite.avatica.remote.Service.DatabasePropertyRequest;
+import org.apache.calcite.avatica.remote.Service.DatabasePropertyResponse;
+import org.apache.calcite.avatica.remote.Service.ExecuteResponse;
+import org.apache.calcite.avatica.remote.Service.FetchRequest;
+import org.apache.calcite.avatica.remote.Service.FetchResponse;
+import org.apache.calcite.avatica.remote.Service.PrepareAndExecuteRequest;
+import org.apache.calcite.avatica.remote.Service.PrepareRequest;
+import org.apache.calcite.avatica.remote.Service.PrepareResponse;
+import org.apache.calcite.avatica.remote.Service.Request;
+import org.apache.calcite.avatica.remote.Service.Response;
+import org.apache.calcite.avatica.remote.Service.ResultSetResponse;
+import org.apache.calcite.avatica.remote.Service.SchemasRequest;
+import org.apache.calcite.avatica.remote.Service.TableTypesRequest;
+import org.apache.calcite.avatica.remote.Service.TablesRequest;
+import org.apache.calcite.avatica.remote.Service.TypeInfoRequest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.io.IOException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests serialization of requests and response objects.
+ *
+ * @param <T> The object class being tested
+ */
+@RunWith(Parameterized.class)
+public class ProtobufTranslationImplTest<T> {
+
+  /**
+   * Simple function definition that acts as an identity.
+   *
+   * @param <A> Argument type
+   */
+  private interface IdentityFunction<A> {
+    A apply(A obj) throws IOException;
+  }
+
+  /**
+   * Identity function that accepts a request, serializes it to protobuf, and converts it
back.
+   */
+  private static class RequestFunc implements IdentityFunction<Request> {
+    private final ProtobufTranslation translation;
+
+    public RequestFunc(ProtobufTranslation translation) {
+      this.translation = translation;
+    }
+
+    public Request apply(Request request) throws IOException {
+      // Serialize and then re-parse the request
+      return translation.parseRequest(translation.serializeRequest(request));
+    }
+  }
+
+  /**
+   * Identity function that accepts a response, serializes it to protobuf, and converts it
back.
+   */
+  private static class ResponseFunc implements IdentityFunction<Response> {
+    private final ProtobufTranslation translation;
+
+    public ResponseFunc(ProtobufTranslation translation) {
+      this.translation = translation;
+    }
+
+    public Response apply(Response response) throws IOException {
+      // Serialize and then re-pare the response
+      return translation.parseResponse(translation.serializeResponse(response));
+    }
+  }
+
+  @Parameters
+  public static List<Object[]> parameters() {
+    List<Object[]> params = new ArrayList<>();
+
+    // The impl we're testing
+    ProtobufTranslationImpl translation = new ProtobufTranslationImpl();
+
+    // Identity transformation for Requests
+    RequestFunc requestFunc = new RequestFunc(translation);
+    // Identity transformation for Responses
+    ResponseFunc responseFunc = new ResponseFunc(translation);
+
+    List<Request> requests = getRequests();
+    List<Request> requestsWithNulls = getRequestsWithNulls();
+    List<Response> responses = getResponses();
+
+    // Requests
+    for (Request request : requests) {
+      params.add(new Object[] {request, requestFunc});
+    }
+
+    // Requests with nulls in parameters
+    for (Request request : requestsWithNulls) {
+      params.add(new Object[] {request, requestFunc});
+    }
+
+    // Responses
+    for (Response response : responses) {
+      params.add(new Object[] {response, responseFunc});
+    }
+
+    return params;
+  }
+
+  /**
+   * Generates a collection of Requests whose serialization will be tested.
+   */
+  private static List<Request> getRequests() {
+    LinkedList<Request> requests = new LinkedList<>();
+
+    requests.add(new CatalogsRequest());
+    requests.add(new DatabasePropertyRequest());
+    requests.add(new SchemasRequest("catalog", "schemaPattern"));
+    requests.add(
+        new TablesRequest("catalog", "schemaPattern", "tableNamePattern",
+            Arrays.asList("STRING", "BOOLEAN", "INT")));
+    requests.add(new TableTypesRequest());
+    requests.add(
+        new ColumnsRequest("catalog", "schemaPattern", "tableNamePattern",
+            "columnNamePattern"));
+    requests.add(new TypeInfoRequest());
+    requests.add(
+        new PrepareAndExecuteRequest("connectionId", Integer.MAX_VALUE, "sql",
+            Long.MAX_VALUE));
+    requests.add(new PrepareRequest("connectionId", "sql", Long.MAX_VALUE));
+
+    List<TypedValue> paramValues =
+        Arrays.asList(TypedValue.create(Rep.BOOLEAN.name(), Boolean.TRUE),
+            TypedValue.create(Rep.STRING.name(), "string"));
+    FetchRequest fetchRequest = new FetchRequest("connectionId", Integer.MAX_VALUE, paramValues,
+        Long.MAX_VALUE, Integer.MAX_VALUE);
+    requests.add(fetchRequest);
+
+    requests.add(new CreateStatementRequest("connectionId"));
+    requests.add(new CloseStatementRequest("connectionId", Integer.MAX_VALUE));
+    requests.add(new CloseConnectionRequest("connectionId"));
+    requests.add(
+        new ConnectionSyncRequest("connectionId",
+            new ConnectionPropertiesImpl(Boolean.FALSE, Boolean.FALSE,
+                Integer.MAX_VALUE, "catalog", "schema")));
+
+    return requests;
+  }
+
+  private static List<Request> getRequestsWithNulls() {
+    LinkedList<Request> requests = new LinkedList<>();
+
+    // We're pretty fast and loose on what can be null.
+    requests.add(new SchemasRequest(null, null));
+    // Repeated fields default to an empty list
+    requests.add(new TablesRequest(null, null, null, Collections.<String>emptyList()));
+    requests.add(new ColumnsRequest(null, null, null, null));
+    requests.add(new PrepareAndExecuteRequest(null, 0, null, 0));
+    requests.add(new PrepareRequest(null, null, 0));
+    requests.add(new CreateStatementRequest(null));
+    requests.add(new CloseStatementRequest(null, 0));
+    requests.add(new CloseConnectionRequest(null));
+    requests.add(new ConnectionSyncRequest(null, null));
+
+    return requests;
+  }
+
+  /**
+   * Generates a collection of Responses whose serialization will be tested.
+   */
+  private static List<Response> getResponses() {
+    LinkedList<Response> responses = new LinkedList<>();
+
+    // Nested classes (Signature, ColumnMetaData, CursorFactory, etc) are implicitly getting
tested)
+
+    // Stub out the metadata for a row
+    List<ColumnMetaData> columns =
+        Arrays.<ColumnMetaData>asList(MetaImpl.columnMetaData("str", 0, String.class),
+            MetaImpl.columnMetaData("count", 1, Integer.class));
+    List<AvaticaParameter> params =
+        Arrays.asList(
+            new AvaticaParameter(false, 10, 0, Types.VARCHAR, "VARCHAR",
+                String.class.getName(), "str"));
+    Meta.CursorFactory cursorFactory = Meta.CursorFactory.create(Style.LIST, Object.class,
+        Arrays.asList("str", "count"));
+    // The row values
+    List<Object> rows = new ArrayList<>();
+    rows.add(new Object[] {"str_value", 50});
+
+    // Create the signature and frame using the metadata and values
+    Signature signature = Signature.create(columns, "sql", params, cursorFactory);
+    Frame frame = Frame.create(Integer.MAX_VALUE, true, rows);
+
+    // And then create a ResultSetResponse
+    ResultSetResponse results1 = new ResultSetResponse("connectionId", Integer.MAX_VALUE,
true,
+        signature, frame, Long.MAX_VALUE);
+    responses.add(results1);
+
+    responses.add(new CloseStatementResponse());
+
+    ConnectionPropertiesImpl connProps = new ConnectionPropertiesImpl(false, true,
+        Integer.MAX_VALUE, "catalog", "schema");
+    responses.add(new ConnectionSyncResponse(connProps));
+
+    responses.add(new CreateStatementResponse("connectionId", Integer.MAX_VALUE));
+
+    Map<Meta.DatabaseProperty, Object> propertyMap = new HashMap<>();
+    for (Meta.DatabaseProperty prop : Meta.DatabaseProperty.values()) {
+      propertyMap.put(prop, prop.defaultValue);
+    }
+    responses.add(new DatabasePropertyResponse(propertyMap));
+
+    responses.add(new ExecuteResponse(Arrays.asList(results1, results1, results1)));
+    responses.add(new FetchResponse(frame));
+    responses.add(
+        new PrepareResponse(
+            new Meta.StatementHandle("connectionId", Integer.MAX_VALUE,
+                signature)));
+
+    return responses;
+  }
+
+  private final T object;
+  private final IdentityFunction<T> function;
+
+  public ProtobufTranslationImplTest(T object, IdentityFunction<T> func) {
+    this.object = object;
+    this.function = func;
+  }
+
+  @Test
+  public void testSerialization() throws Exception {
+    // Function acts as opposite sides of the transport.
+    // An object (a request or response) starts on one side
+    // of the transport, serialized, "sent" over the transport
+    // and then reconstituted. The object on either side should
+    // be equivalent.
+    assertEquals(object, this.function.apply(object));
+  }
+}
+
+// End ProtobufTranslationImplTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/avatica/src/test/java/org/apache/calcite/avatica/remote/TypedValueTest.java
----------------------------------------------------------------------
diff --git a/avatica/src/test/java/org/apache/calcite/avatica/remote/TypedValueTest.java b/avatica/src/test/java/org/apache/calcite/avatica/remote/TypedValueTest.java
new file mode 100644
index 0000000..28fe6f6
--- /dev/null
+++ b/avatica/src/test/java/org/apache/calcite/avatica/remote/TypedValueTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.calcite.avatica.remote;
+
+import org.apache.calcite.avatica.ColumnMetaData.Rep;
+import org.apache.calcite.avatica.util.ByteString;
+
+import org.junit.Test;
+
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test serialization of TypedValue.
+ */
+public class TypedValueTest {
+
+  private void serializeAndEqualityCheck(TypedValue value) {
+    TypedValue copy = TypedValue.fromProto(value.toProto());
+
+    assertEquals(value.type, copy.type);
+    assertEquals(value.value, copy.value);
+  }
+
+  @Test
+  public void testBoolean() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_BOOLEAN, true));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.BOOLEAN, Boolean.TRUE));
+  }
+
+  @Test
+  public void testByte() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_BYTE, (byte) 4));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.BYTE, Byte.valueOf((byte) 4)));
+  }
+
+  @Test
+  public void testShort() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_SHORT, (short) 42));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.SHORT, Short.valueOf((short) 42)));
+  }
+
+  @Test
+  public void testInteger() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_INT, (int) 42000));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.INTEGER, Integer.valueOf((int) 42000)));
+  }
+
+  @Test
+  public void testLong() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_LONG, Long.MAX_VALUE));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.LONG, Long.valueOf(Long.MAX_VALUE)));
+  }
+
+  @Test
+  public void testFloat() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_FLOAT, 3.14159f));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.FLOAT, Float.valueOf(3.14159f)));
+  }
+
+  @Test
+  public void testDouble() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_DOUBLE, Double.MAX_VALUE));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.DOUBLE, Double.valueOf(Double.MAX_VALUE)));
+  }
+
+  @Test
+  public void testChar() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.PRIMITIVE_CHAR, 'c'));
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.CHARACTER, Character.valueOf('c')));
+  }
+
+  @Test
+  public void testString() {
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.STRING, "qwertyasdf"));
+  }
+
+  @Test
+  public void testByteString() {
+    serializeAndEqualityCheck(
+        TypedValue.ofLocal(Rep.BYTE_STRING,
+            new ByteString("qwertyasdf".getBytes(StandardCharsets.UTF_8))));
+  }
+
+  @Test
+  public void testSqlDate() {
+    // days since epoch
+    serializeAndEqualityCheck(TypedValue.ofLocal(Rep.JAVA_SQL_DATE, 25));
+  }
+
+  @Test
+  public void testUtilDate() {
+    serializeAndEqualityCheck(
+        TypedValue.ofLocal(Rep.JAVA_UTIL_DATE, System.currentTimeMillis()));
+  }
+
+  @Test
+  public void testSqlTime() {
+    // millis since epoch
+    serializeAndEqualityCheck(
+        TypedValue.ofLocal(Rep.JAVA_SQL_TIME, 42 * 1024 * 1024));
+  }
+
+  @Test
+  public void testSqlTimestamp() {
+    serializeAndEqualityCheck(
+        TypedValue.ofLocal(Rep.JAVA_SQL_TIMESTAMP, 42L * 1024 * 1024 * 1024));
+  }
+}
+
+// End TypedValueTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index b05871f..e65d748 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -56,18 +56,6 @@ limitations under the License.
       <artifactId>commons-dbcp</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.google.code.findbugs</groupId>
       <artifactId>jsr305</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/example/csv/pom.xml
----------------------------------------------------------------------
diff --git a/example/csv/pom.xml b/example/csv/pom.xml
index 3cf8c37..fd0f53c 100644
--- a/example/csv/pom.xml
+++ b/example/csv/pom.xml
@@ -37,6 +37,10 @@ limitations under the License.
   <dependencies>
     <dependency>
       <groupId>org.apache.calcite</groupId>
+      <artifactId>calcite-avatica</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.calcite</groupId>
       <artifactId>calcite-core</artifactId>
     </dependency>
     <dependency>
@@ -45,14 +49,6 @@ limitations under the License.
     </dependency>
 
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f9210e5..6c46e8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -157,6 +157,11 @@ limitations under the License.
         <version>14.0.1</version>
       </dependency>
       <dependency>
+        <groupId>com.google.protobuf</groupId>
+        <artifactId>protobuf-java</artifactId>
+        <version>3.0.0-alpha-2</version>
+      </dependency>
+      <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
         <version>1.4.185</version>
@@ -223,6 +228,11 @@ limitations under the License.
         <version>3.2</version>
       </dependency>
       <dependency>
+        <groupId>org.mockito</groupId>
+        <artifactId>mockito-all</artifactId>
+        <version>1.10.19</version>
+      </dependency>
+      <dependency>
         <groupId>org.postgresql</groupId>
         <artifactId>postgresql</artifactId>
         <version>9.3-1102-jdbc3</version>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/site/_docs/howto.md
----------------------------------------------------------------------
diff --git a/site/_docs/howto.md b/site/_docs/howto.md
index cf03947..3bde093 100644
--- a/site/_docs/howto.md
+++ b/site/_docs/howto.md
@@ -364,7 +364,13 @@ public class AdapterContextTest {
 }
 {% endhighlight %}
 
-### JavaTypeFactory
+# Advanced topics for developers
+
+The following sections might be of interest if you are adding features
+to particular parts of the code base. You don't need to understand
+these topics if you are just building from source and running tests.
+
+## JavaTypeFactory
 
 When Calcite compares types (instances of `RelDataType`), it requires them to be the same
 object. If there are two distinct type instances that refer to the
@@ -374,6 +380,42 @@ recommended to:
 * Use a single instance of `JavaTypeFactory` within the calcite context;
 * Store the types so that the same object is always returned for the same type.
 
+## Rebuilding generated Protocol Buffer code
+
+Calcite's Avatica Server component supports RPC serialization
+using [Protocol Buffers](https://developers.google.com/protocol-buffers/).
+In the context of Avatica, Protocol Buffers can
+generate a collection of messages defined by a schema. The library
+itself can parse old serialized messages using a
+new schema. This is highly desirable in an environment where the
+client and server are not guaranteed to have the same version of
+objects.
+
+Typically, the code generated by the Protocol Buffers library doesn't
+need to be re-generated only every build, only when the schema changes.
+
+First, install Protobuf 3.0-beta:
+
+{% highlight bash %}
+$ wget https://github.com/google/protobuf/releases/download/v3.0.0-beta-1/protobuf-java-3.0.0-beta-1.tar.gz
+$ tar xf protobuf-java-3.0.0-beta-1.tar.gz && cd protobuf-3.0.0-beta-1
+$ ./configure
+$ make
+$ sudo make install
+{% endhighlight %}
+
+Then, re-generate the compiled code:
+
+{% highlight bash %}
+$ cd avatica
+$ ./src/main/scripts/generate-protobuf.sh
+{% endhighlight %}
+
+# Advanced topics for committers
+
+The following sections are of interest to Calcite committers and in
+particular release managers.
+
 ## Set up PGP signing keys (for Calcite committers)
 
 Follow instructions [here](http://www.apache.org/dev/release-signing) to

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cb7c213c/src/main/config/checkstyle/suppressions.xml
----------------------------------------------------------------------
diff --git a/src/main/config/checkstyle/suppressions.xml b/src/main/config/checkstyle/suppressions.xml
index 6662eca..4086a9e 100644
--- a/src/main/config/checkstyle/suppressions.xml
+++ b/src/main/config/checkstyle/suppressions.xml
@@ -27,6 +27,7 @@ limitations under the License.
   <suppress checks=".*" files="git.properties"/>
   <suppress checks=".*" files="trace.properties"/>
   <suppress checks=".*" files="release.properties"/>
+  <suppress checks=".*" files="avatica/src/main/java/org/apache/calcite/avatica/proto"/>
 
   <!-- This file triggers https://github.com/checkstyle/checkstyle/issues/92,
        through no fault of its own. -->


Mime
View raw message