You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by zh...@apache.org on 2020/05/08 12:33:49 UTC

[pulsar] 03/38: ISSUE-6612 FIX: parse long field in GenricJsonRecord (#6612) (#6622)

This is an automated email from the ASF dual-hosted git repository.

zhaijia pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit 8035ae04a3f7f96e9829957dd5d3185ad4049b6c
Author: Lin Yiming <ro...@gmail.com>
AuthorDate: Mon Apr 6 03:17:12 2020 +0800

    ISSUE-6612 FIX: parse long field in GenricJsonRecord (#6612) (#6622)
    
    Fixes #6612
    
    ### Motivation
    
    If message sent in json schema, long field will be decoded as int if its value below Integer.MAX_VALUE, other wise decoded as string.
    For example, the json message below:
    ```json
    {
        "timestamp": 1585204833128
    }
    ```
    will be decoded as
    
    ```json
    {
        "timestamp": "1585204833128"
    }
    ```
    
    ### Modifications
    
    Add field type check in GenericJsonRecord
    (cherry picked from commit 1aad3b73efe2a2afe0cd2598987f112416117159)
---
 .../impl/schema/generic/GenericJsonRecord.java     | 12 +++--
 .../impl/schema/generic/GenericJsonRecordTest.java | 57 ++++++++++++++++++++++
 2 files changed, 65 insertions(+), 4 deletions(-)

diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
index 6f57631..650ca46 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
@@ -55,12 +55,16 @@ class GenericJsonRecord extends VersionedGenericRecord {
             return new GenericJsonRecord(schemaVersion, fields, fn);
         } else if (fn.isBoolean()) {
             return fn.asBoolean();
-        } else if (fn.isInt()) {
-            return fn.asInt();
         } else if (fn.isFloatingPointNumber()) {
             return fn.asDouble();
-        } else if (fn.isDouble()) {
-            return fn.asDouble();
+        } else if (fn.isBigInteger()) {
+            if (fn.canConvertToLong()) {
+                return fn.asLong();
+            } else {
+                return fn.asText();
+            }
+        } else if (fn.isNumber()) {
+            return fn.numberValue();
         } else {
             return fn.asText();
         }
diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java
new file mode 100644
index 0000000..0de3e3e
--- /dev/null
+++ b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecordTest.java
@@ -0,0 +1,57 @@
+/**
+ * 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.pulsar.client.impl.schema.generic;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+
+public class GenericJsonRecordTest {
+
+    @Test
+    public void decodeLongField() throws Exception{
+        String jsonStr = "{\"timestamp\":1585204833128, \"count\":2, \"value\": 1.1, \"on\":true}";
+        byte[] jsonStrBytes = jsonStr.getBytes();
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode jn = objectMapper.readTree(new String(jsonStrBytes, 0, jsonStrBytes.length, UTF_8));
+        GenericJsonRecord record = new GenericJsonRecord(null, Collections.emptyList(), jn);
+
+        Object longValue = record.getField("timestamp");
+        assertTrue(longValue instanceof Long);
+        assertEquals(1585204833128L, longValue);
+
+        Object intValue = record.getField("count");
+        assertTrue(intValue instanceof Integer);
+        assertEquals(2, intValue);
+
+        Object value = record.getField("value");
+        assertTrue(value instanceof Double);
+        assertEquals(1.1, value);
+
+        Object boolValue = record.getField("on");
+        assertTrue((boolean)boolValue);
+    }
+}
\ No newline at end of file