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]