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

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 3f5cf314 fix(java): fix scala object type codegen (#1659)
3f5cf314 is described below

commit 3f5cf31461cfed1f2c1d0f5b620529fe4abb6f40
Author: Shawn Yang <[email protected]>
AuthorDate: Wed May 29 21:13:23 2024 +0800

    fix(java): fix scala object type codegen (#1659)
    
    ## What does this PR do?
    
    fix scala object type codegen
    
    ## Related issues
    
    Closes #1658
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/incubator-fury/issues/new/choose)
    describing the need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    
    ## Benchmark
    
    <!--
    When the PR has an impact on performance (if you don't know whether the
    PR will have an impact on performance, you can submit the PR first, and
    if it will have impact on performance, the code reviewer will explain
    it), be sure to attach a benchmark data here.
    -->
---
 .../org/apache/fury/codegen/CodegenContext.java    |  9 +++---
 .../java/org/apache/fury/codegen/Expression.java   |  2 +-
 .../org/apache/fury/reflect/ReflectionUtils.java   |  9 ++++--
 .../main/java/org/apache/fury/type/TypeUtils.java  |  4 +--
 java/fury-testsuite/pom.xml                        |  6 ++++
 .../java/org/apache/fury/test/SparkTypeTest.java   | 34 +++++++++-------------
 .../serializer/SingleObjectSerializerTest.scala    |  2 +-
 7 files changed, 34 insertions(+), 32 deletions(-)

diff --git 
a/java/fury-core/src/main/java/org/apache/fury/codegen/CodegenContext.java 
b/java/fury-core/src/main/java/org/apache/fury/codegen/CodegenContext.java
index 624e55e9..4a324f14 100644
--- a/java/fury-core/src/main/java/org/apache/fury/codegen/CodegenContext.java
+++ b/java/fury-core/src/main/java/org/apache/fury/codegen/CodegenContext.java
@@ -252,8 +252,7 @@ public class CodegenContext {
     if (clz.isArray()) {
       return "arr";
     } else {
-      String canonicalName = clz.getCanonicalName();
-      String type = canonicalName != null ? type(clz) : "Object";
+      String type = clz.getCanonicalName() != null ? type(clz) : "Object";
       int index = type.lastIndexOf(".");
       String name;
       if (index >= 0) {
@@ -283,7 +282,7 @@ public class CodegenContext {
     if (clz.isArray()) {
       return getArrayType(clz);
     }
-    String type = ReflectionUtils.getCanonicalName(clz);
+    String type = ReflectionUtils.getLiteralName(clz);
     if (type.startsWith("java.lang")) {
       if (!type.substring("java.lang.".length()).contains(".")) {
         String simpleName = clz.getSimpleName();
@@ -360,7 +359,7 @@ public class CodegenContext {
    */
   public void addImports(Class<?>... classes) {
     for (Class<?> clz : classes) {
-      imports.add(ReflectionUtils.getCanonicalName(clz));
+      imports.add(ReflectionUtils.getLiteralName(clz));
     }
   }
 
@@ -382,7 +381,7 @@ public class CodegenContext {
    * @param cls class to be imported
    */
   public void addImport(Class<?> cls) {
-    this.imports.add(ReflectionUtils.getCanonicalName(cls));
+    this.imports.add(ReflectionUtils.getLiteralName(cls));
   }
 
   /**
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java 
b/java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java
index d2572f77..36cdeb44 100644
--- a/java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java
+++ b/java/fury-core/src/main/java/org/apache/fury/codegen/Expression.java
@@ -343,7 +343,7 @@ public interface Expression {
           if (valueClass.isArray()) {
             v = String.format("%s.class", TypeUtils.getArrayType((Class<?>) 
value));
           } else {
-            v = String.format("%s.class", 
ReflectionUtils.getCanonicalName((Class<?>) (value)));
+            v = String.format("%s.class", 
ReflectionUtils.getLiteralName((Class<?>) (value)));
           }
           return new ExprCode(FalseLiteral, new LiteralValue(javaType, v));
         } else {
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/reflect/ReflectionUtils.java 
b/java/fury-core/src/main/java/org/apache/fury/reflect/ReflectionUtils.java
index d837896c..f641f14a 100644
--- a/java/fury-core/src/main/java/org/apache/fury/reflect/ReflectionUtils.java
+++ b/java/fury-core/src/main/java/org/apache/fury/reflect/ReflectionUtils.java
@@ -554,17 +554,22 @@ public class ReflectionUtils {
   }
 
   /**
-   * Returns the canonical name of the underlying class as defined by 
<cite>The Java Language
+   * Returns the literal name of the underlying class as defined by <cite>The 
Java Language
    * Specification</cite>. Throw {@link IllegalArgumentException} if the 
underlying class does not
    * have a canonical name(i.e., if it is a local or anonymous class or an 
array whose component
    * type does not have a canonical name).
    *
    * @throws IllegalArgumentException if the canonical name of the underlying 
class doesn't exist.
    */
-  public static String getCanonicalName(Class<?> cls) {
+  public static String getLiteralName(Class<?> cls) {
     String canonicalName = cls.getCanonicalName();
     org.apache.fury.util.Preconditions.checkArgument(
         canonicalName != null, "Class %s doesn't have canonical name", cls);
+    if (canonicalName.endsWith(".")) {
+      // qualifier name of scala object type will ends with `.`
+      String name = cls.getName();
+      canonicalName = name.substring(0, name.length() - 1).replace("$", ".") + 
"$";
+    }
     return canonicalName;
   }
 
diff --git a/java/fury-core/src/main/java/org/apache/fury/type/TypeUtils.java 
b/java/fury-core/src/main/java/org/apache/fury/type/TypeUtils.java
index b634d194..63d64c69 100644
--- a/java/fury-core/src/main/java/org/apache/fury/type/TypeUtils.java
+++ b/java/fury-core/src/main/java/org/apache/fury/type/TypeUtils.java
@@ -401,7 +401,7 @@ public class TypeUtils {
   /** Returns s string that represents array type declaration of type. */
   public static String getArrayType(Class<?> type) {
     Tuple2<Class<?>, Integer> info = getArrayComponentInfo(type);
-    StringBuilder typeBuilder = new 
StringBuilder(ReflectionUtils.getCanonicalName(info.f0));
+    StringBuilder typeBuilder = new 
StringBuilder(ReflectionUtils.getLiteralName(info.f0));
     for (int i = 0; i < info.f1; i++) {
       typeBuilder.append("[]");
     }
@@ -410,7 +410,7 @@ public class TypeUtils {
 
   /** Create an array type declaration from elemType and dimensions. */
   public static String getArrayType(Class<?> elemType, int[] dimensions) {
-    StringBuilder typeBuilder = new 
StringBuilder(ReflectionUtils.getCanonicalName(elemType));
+    StringBuilder typeBuilder = new 
StringBuilder(ReflectionUtils.getLiteralName(elemType));
     for (int i = 0; i < dimensions.length; i++) {
       typeBuilder.append('[').append(dimensions[i]).append(']');
     }
diff --git a/java/fury-testsuite/pom.xml b/java/fury-testsuite/pom.xml
index 165e17db..06010039 100644
--- a/java/fury-testsuite/pom.xml
+++ b/java/fury-testsuite/pom.xml
@@ -99,6 +99,12 @@
       <version>8.5.6</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.spark</groupId>
+      <artifactId>spark-sql_2.13</artifactId>
+      <version>3.2.1</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
 b/java/fury-testsuite/src/test/java/org/apache/fury/test/SparkTypeTest.java
similarity index 51%
copy from 
scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
copy to 
java/fury-testsuite/src/test/java/org/apache/fury/test/SparkTypeTest.java
index b79533b6..7459cf98 100644
--- 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
+++ b/java/fury-testsuite/src/test/java/org/apache/fury/test/SparkTypeTest.java
@@ -17,27 +17,19 @@
  * under the License.
  */
 
-package org.apache.fury.serializer
+package org.apache.fury.test;
 
-import org.apache.fury.Fury
-import org.apache.fury.config.Language
-import org.scalatest.matchers.should.Matchers
-import org.scalatest.wordspec.AnyWordSpec
+import org.apache.fury.Fury;
+import org.apache.fury.TestBase;
+import org.apache.spark.sql.types.DecimalType;
+import org.apache.spark.sql.types.DecimalType$;
+import org.testng.annotations.Test;
 
-object singleton {}
-
-case class Pair(f1: Any, f2: Any)
-
-class SingleObjectSerializerTest extends AnyWordSpec with Matchers {
-  "fury scala object support" should {
-    "serialize/deserialize" in {
-      val fury = Fury.builder()
-        .withLanguage(Language.JAVA)
-        .withRefTracking(true)
-        .withScalaOptimizationEnabled(true)
-        .requireClassRegistration(false).build()
-      fury.deserialize(fury.serialize(singleton)) shouldBe singleton
-      fury.deserialize(fury.serialize(Pair(singleton, singleton))) shouldEqual 
Pair(singleton, singleton)
-    }
+public class SparkTypeTest extends TestBase {
+  @Test(dataProvider = "enableCodegen")
+  public void testObjectType(boolean enableCodegen) {
+    Fury fury = 
builder().withRefTracking(true).withCodegen(enableCodegen).build();
+    fury.serialize(DecimalType$.MODULE$);
+    fury.serialize(new DecimalType(10, 10));
   }
-}
\ No newline at end of file
+}
diff --git 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
 
b/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
index b79533b6..6026e13b 100644
--- 
a/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
+++ 
b/scala/src/test/scala/org/apache/fury/serializer/SingleObjectSerializerTest.scala
@@ -40,4 +40,4 @@ class SingleObjectSerializerTest extends AnyWordSpec with 
Matchers {
       fury.deserialize(fury.serialize(Pair(singleton, singleton))) shouldEqual 
Pair(singleton, singleton)
     }
   }
-}
\ No newline at end of file
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to