This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch gg-13618-asm
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/gg-13618-asm by this push:
new a61b6b9 Drop generated serialized compiled with JDK.
a61b6b9 is described below
commit a61b6b90e48f8efb226420eb5b81ae1d21fb0116
Author: Andrew Mashenkov <[email protected]>
AuthorDate: Thu Dec 31 17:15:46 2020 +0300
Drop generated serialized compiled with JDK.
---
.../schema/marshaller/SerializerFactory.java | 4 +-
.../IdentityObjectMarshallerExprGenerator.java | 66 ----
.../codegen/MarshallerCodeGenerator.java | 58 ---
.../codegen/ObjectMarshallerCodeGenerator.java | 114 ------
.../marshaller/codegen/SerializerGenerator.java | 387 ---------------------
.../codegen/TupleColumnAccessCodeGenerator.java | 159 ---------
.../benchmarks/SerializerBenchmarkTest.java | 4 +-
.../schema/marshaller/JavaSerializerTest.java | 2 -
8 files changed, 3 insertions(+), 791 deletions(-)
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/SerializerFactory.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/SerializerFactory.java
index 77b784c..4c28f4b 100644
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/SerializerFactory.java
+++
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/SerializerFactory.java
@@ -18,7 +18,7 @@
package org.apache.ignite.internal.schema.marshaller;
import org.apache.ignite.internal.schema.SchemaDescriptor;
-import
org.apache.ignite.internal.schema.marshaller.codegen.SerializerGenerator;
+import org.apache.ignite.internal.schema.marshaller.asm.AsmSerializerGenerator;
import
org.apache.ignite.internal.schema.marshaller.reflection.JavaSerializerFactory;
import org.apache.ignite.lang.IgniteExperimental;
@@ -31,7 +31,7 @@ public interface SerializerFactory {
* @return Serializer factory back by code generator.
*/
public static SerializerFactory createGeneratedSerializerFactory() {
- return new SerializerGenerator();
+ return new AsmSerializerGenerator();
}
/**
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/IdentityObjectMarshallerExprGenerator.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/IdentityObjectMarshallerExprGenerator.java
deleted file mode 100644
index 975599b..0000000
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/IdentityObjectMarshallerExprGenerator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.ignite.internal.schema.marshaller.codegen;
-
-import com.squareup.javapoet.CodeBlock;
-import com.squareup.javapoet.TypeSpec;
-import org.apache.ignite.internal.schema.marshaller.Serializer;
-
-/**
- * Generate {@link Serializer} method's bodies for simple types.
- */
-class IdentityObjectMarshallerExprGenerator implements MarshallerCodeGenerator
{
- /** Tuple column accessor. */
- private final TupleColumnAccessCodeGenerator columnAccessor;
-
- /**
- * Constructor.
- *
- * @param columnAccessor Tuple column code generator.
- */
- IdentityObjectMarshallerExprGenerator(TupleColumnAccessCodeGenerator
columnAccessor) {
- this.columnAccessor = columnAccessor;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSimpleType() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock unmarshallObjectCode(String tupleExpr) {
- return CodeBlock.builder()
- .addStatement("return $L", columnAccessor.read(tupleExpr))
- .build();
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock marshallObjectCode(String asm, String objVar) {
- return columnAccessor.write(asm, objVar);
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock getValueCode(String objVar, int colIdx) {
- return CodeBlock.of(objVar);
- }
-
- /** {@inheritDoc} */
- @Override public void initStaticHandlers(TypeSpec.Builder builder, String
tClassExpr, CodeBlock.Builder staticBuilder) {
- throw new UnsupportedOperationException("Static handlers are not
applicable to simple types.");
- }
-}
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/MarshallerCodeGenerator.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/MarshallerCodeGenerator.java
deleted file mode 100644
index b2547d0..0000000
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/MarshallerCodeGenerator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.ignite.internal.schema.marshaller.codegen;
-
-import com.squareup.javapoet.CodeBlock;
-import com.squareup.javapoet.TypeSpec;
-
-/**
- * Marshaller code generator.
- */
-interface MarshallerCodeGenerator {
- /**
- * @return {@code true} if it is simple object marshaller, {@code false}
otherwise.
- */
- boolean isSimpleType();
-
- /**
- * @param tupleExpr Tuple to read from.
- * @return Unmarshall object code.
- */
- CodeBlock unmarshallObjectCode(String tupleExpr);
-
- /**
- * @param asm Tuple assembler to write to.
- * @param objVar Object to serialize.
- * @return Marshall object code.
- */
- CodeBlock marshallObjectCode(String asm, String objVar);
-
- /**
- * @param objVar Object var.
- * @param colIdx Column index.
- * @return Object field value for given column.
- */
- CodeBlock getValueCode(String objVar, int colIdx);
-
- /**
- * @param classBuilder Class builder.
- * @param tClassExpr Target class expression.
- * @param staticInitBuilder Static initializer builder.
- */
- void initStaticHandlers(TypeSpec.Builder classBuilder, String tClassExpr,
CodeBlock.Builder staticInitBuilder);
-}
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/ObjectMarshallerCodeGenerator.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/ObjectMarshallerCodeGenerator.java
deleted file mode 100644
index 0330075..0000000
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/ObjectMarshallerCodeGenerator.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.ignite.internal.schema.marshaller.codegen;
-
-import com.squareup.javapoet.CodeBlock;
-import com.squareup.javapoet.FieldSpec;
-import com.squareup.javapoet.TypeSpec;
-import java.lang.invoke.VarHandle;
-import java.lang.reflect.Field;
-import javax.lang.model.element.Modifier;
-import org.apache.ignite.internal.schema.Columns;
-import org.apache.ignite.internal.schema.marshaller.MarshallerUtil;
-import org.apache.ignite.internal.schema.marshaller.Serializer;
-
-/**
- * Generates {@link Serializer} methods code.
- */
-class ObjectMarshallerCodeGenerator implements MarshallerCodeGenerator {
- /** Target object factory var. */
- private final String objectFactoryVar;
-
- /** Mapped columns. */
- private final Columns columns;
-
- /** Object field access expression generators. */
- private final TupleColumnAccessCodeGenerator[] columnAccessessors;
-
- /**
- * Constructor.
- *
- * @param tClass Target object class.
- * @param objectFactoryVar Target object factory var.
- * @param columns Column object is mapped to.
- * @param firstColIdx Column index offset.
- */
- public ObjectMarshallerCodeGenerator(Class<?> tClass, String
objectFactoryVar, Columns columns, int firstColIdx) {
- this.objectFactoryVar = objectFactoryVar;
-
- this.columns = columns;
- columnAccessessors = new
TupleColumnAccessCodeGenerator[this.columns.length()];
- try {
- for (int i = 0; i < columns.length(); i++) {
- final Field field =
tClass.getDeclaredField(columns.column(i).name());
-
- columnAccessessors[i] =
TupleColumnAccessCodeGenerator.createAccessor(MarshallerUtil.mode(field.getType()),
i + firstColIdx);
- }
- }
- catch (NoSuchFieldException ex) {
- throw new IllegalStateException(ex);
- }
- }
- /** {@inheritDoc} */
- @Override public boolean isSimpleType() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock unmarshallObjectCode(String tupleExpr) {
- final CodeBlock.Builder builder = CodeBlock.builder()
- .addStatement("Object obj = $L.create()", objectFactoryVar);
-
- for (int i = 0; i < columnAccessessors.length; i++)
- builder.addStatement("FIELD_HANDLE_$L.set(obj, $L)",
columnAccessessors[i].columnIdx(), columnAccessessors[i].read(tupleExpr));
-
- builder.addStatement("return obj");
- return builder.build();
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock getValueCode(String objVar, int i) {
- return CodeBlock.of("($T)FIELD_HANDLE_$L.get($L)",
columnAccessessors[i].mappedType(), columnAccessessors[i].columnIdx(), objVar);
- }
-
- /** {@inheritDoc} */
- @Override public CodeBlock marshallObjectCode(String asm, String objVar) {
- final CodeBlock.Builder builder = CodeBlock.builder();
-
- for (int i = 0; i < columnAccessessors.length; i++)
- builder.add(columnAccessessors[i].write(asm, getValueCode(objVar,
i).toString()));
-
- return builder.build();
- }
-
- /** {@inheritDoc} */
- @Override public void initStaticHandlers(TypeSpec.Builder builder, String
tClassExpr, CodeBlock.Builder staticBuilder) {
- for (int i = 0; i < columnAccessessors.length; i++) {
- builder.addField(FieldSpec.builder(
- VarHandle.class,
- CodeBlock.of("FIELD_HANDLE_$L",
columnAccessessors[i].columnIdx()).toString(),
- Modifier.PRIVATE,
- Modifier.FINAL,
- Modifier.STATIC)
- .build());
-
- staticBuilder.addStatement("FIELD_HANDLE_$L =
lookup.unreflectVarHandle($L.getDeclaredField($S))",
- columnAccessessors[i].columnIdx(), tClassExpr,
columns.column(i).name());
- }
- }
-}
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/SerializerGenerator.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/SerializerGenerator.java
deleted file mode 100644
index d37bd0c..0000000
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/SerializerGenerator.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * 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.ignite.internal.schema.marshaller.codegen;
-
-import com.squareup.javapoet.AnnotationSpec;
-import com.squareup.javapoet.ArrayTypeName;
-import com.squareup.javapoet.CodeBlock;
-import com.squareup.javapoet.FieldSpec;
-import com.squareup.javapoet.JavaFile;
-import com.squareup.javapoet.MethodSpec;
-import com.squareup.javapoet.ParameterizedTypeName;
-import com.squareup.javapoet.TypeName;
-import com.squareup.javapoet.TypeSpec;
-import java.lang.invoke.MethodHandles;
-import java.lang.reflect.InvocationTargetException;
-import java.util.concurrent.TimeUnit;
-import javax.annotation.processing.Generated;
-import javax.lang.model.element.Modifier;
-import jdk.jfr.Experimental;
-import org.apache.ignite.internal.schema.Columns;
-import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.internal.schema.Tuple;
-import org.apache.ignite.internal.schema.TupleAssembler;
-import org.apache.ignite.internal.schema.marshaller.AbstractSerializer;
-import org.apache.ignite.internal.schema.marshaller.BinaryMode;
-import org.apache.ignite.internal.schema.marshaller.CompilerUtils;
-import org.apache.ignite.internal.schema.marshaller.MarshallerUtil;
-import org.apache.ignite.internal.schema.marshaller.SerializationException;
-import org.apache.ignite.internal.schema.marshaller.Serializer;
-import org.apache.ignite.internal.schema.marshaller.SerializerFactory;
-import org.apache.ignite.internal.util.ObjectFactory;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * {@link Serializer} code generator.
- */
-@Experimental
-public class SerializerGenerator implements SerializerFactory {
- /** Serializer package name. */
- public static final String SERIALIZER_PACKAGE_NAME =
"org.apache.ignite.internal.schema.marshaller";
-
- /** Serializer package name prefix. */
- public static final String SERIALIZER_CLASS_NAME_PREFIX =
"SerializerForSchema_";
-
- /** {@inheritDoc} */
- @Override public Serializer create(
- SchemaDescriptor schema,
- Class<?> keyClass,
- Class<?> valClass
- ) {
- final boolean isDebugEnabled = false; // log.isDebugEnabled();
- final String className = SERIALIZER_CLASS_NAME_PREFIX +
schema.version();
-
- try {
- // Generate Serializer code.
- long generated = System.nanoTime();
- JavaFile javaFile = generateSerializerClassCode(className, schema,
keyClass, valClass);
- generated = System.nanoTime() - generated;
-
- if (isDebugEnabled)
- System.out.println(javaFile.toString());
-
- // Compile.
- long compilation = System.nanoTime();
- ClassLoader loader = CompilerUtils.compileCode(javaFile);
- compilation = System.nanoTime() - compilation;
-
- //TODO: pass code to logger on trace level.
- if (isDebugEnabled)
- System.out.println("Serializer created: generated=" +
TimeUnit.NANOSECONDS.toMicros(generated) + "us" +
- ", compiled=" + TimeUnit.NANOSECONDS.toMicros(compilation)
+ "us." /*+ javaFile.toString()*/);
-
- // Instantiate serializer.
- return (Serializer)loader.loadClass(javaFile.packageName + '.' +
className)
- .getDeclaredConstructor(SchemaDescriptor.class)
- .newInstance(schema);
-
- }
- catch (InstantiationException | ClassNotFoundException |
NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- throw new IllegalStateException("Failed to create serializer for
key-value pair: schemaVer=" + schema.version() +
- ", keyClass=" + keyClass.getSimpleName() + ", valueClass=" +
valClass.getSimpleName(), e);
- }
- }
-
- /**
- * Generates serializer code.
- *
- * @param className Serializer class name.
- * @param schema Schema descriptor.
- * @param keyClass Key class.
- * @param valClass Value class.
- * @return Generated java file representation.
- */
- private JavaFile generateSerializerClassCode(String className,
SchemaDescriptor schema, Class<?> keyClass,
- Class<?> valClass) {
- try {
- // Build code generators.
- final MarshallerCodeGenerator keyMarsh =
createObjectMarshaller(keyClass, "keyFactory", schema.keyColumns(), 0);
- final MarshallerCodeGenerator valMarsh =
createObjectMarshaller(valClass, "valFactory", schema.valueColumns(),
schema.keyColumns().length());
-
- final TypeSpec.Builder classBuilder =
TypeSpec.classBuilder(className)
- .superclass(AbstractSerializer.class)
- .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
-
.addAnnotation(AnnotationSpec.builder(Generated.class).addMember("value", "$S",
getClass().getName()).build());
-
- initStaticFields(keyMarsh, valMarsh, keyClass, valClass,
classBuilder);
-
- classBuilder
- .addField(ParameterizedTypeName.get(ObjectFactory.class),
"keyFactory", Modifier.PRIVATE, Modifier.FINAL)
- .addField(ParameterizedTypeName.get(ObjectFactory.class),
"valFactory", Modifier.PRIVATE, Modifier.FINAL)
- .addMethod(
- // Constructor.
- MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addParameter(SchemaDescriptor.class, "schema")
- .addStatement("super(schema)")
- .addStatement("this.keyFactory =
$T.factoryForClass(KEY_CLASS)", MarshallerUtil.class)
- .addStatement("this.valFactory =
$T.factoryForClass(VALUE_CLASS)", MarshallerUtil.class)
- .build()
- )
- .addMethod(generateTupleAsseblerFactoryMethod(schema,
keyMarsh, valMarsh))
- .addMethod(generateSerializeMethod(keyMarsh, valMarsh))
- .addMethod(generateDeserializeKeyMethod(keyMarsh))
- .addMethod(generateDeserializeValueMethod(valMarsh));
-
- return JavaFile
- .builder(SERIALIZER_PACKAGE_NAME, classBuilder.build())
- .addStaticImport(MethodHandles.class, "Lookup")
- .skipJavaLangImports(true)
- .indent(" ")
- .build();
- }
- catch (Exception ex) {
- throw new IllegalStateException(ex);
- }
- }
-
- /**
- * @param keyMarsh Key marshaller code generator.
- * @param valMarsh Value marshaller code generator.
- * @param classBuilder Serializer class builder.
- */
- private void initStaticFields(
- MarshallerCodeGenerator keyMarsh,
- MarshallerCodeGenerator valMarsh,
- Class<?> keyClass,
- Class<?> valueClass,
- TypeSpec.Builder classBuilder
- ) {
- classBuilder.addField(FieldSpec.builder(
- Class.class,
- "KEY_CLASS",
- Modifier.PRIVATE,
- Modifier.FINAL,
- Modifier.STATIC)
- .build());
-
- classBuilder.addField(FieldSpec.builder(
- Class.class,
- "VALUE_CLASS",
- Modifier.PRIVATE,
- Modifier.FINAL,
- Modifier.STATIC)
- .build());
-
- final CodeBlock.Builder staticInitBuilder = CodeBlock.builder()
- .addStatement("$T.Lookup lookup", MethodHandles.class)
- .beginControlFlow("try");
-
- // Avoid direct class name usage in code to avoid potential linkage
errors.
- staticInitBuilder.addStatement("KEY_CLASS = $T.forName($S)",
Class.class, keyClass.getName());
- staticInitBuilder.addStatement("VALUE_CLASS = $T.forName($S)",
Class.class, valueClass.getName());
-
- if (!keyMarsh.isSimpleType()) {
- staticInitBuilder.addStatement(
- "lookup = $T.privateLookupIn(KEY_CLASS, $T.lookup())",
- MethodHandles.class,
- MethodHandles.class
- );
-
- keyMarsh.initStaticHandlers(classBuilder, "KEY_CLASS",
staticInitBuilder);
- }
-
- if (!valMarsh.isSimpleType()) {
- staticInitBuilder.addStatement(
- "lookup = $T.privateLookupIn(VALUE_CLASS, $T.lookup())",
- MethodHandles.class,
- MethodHandles.class
- );
-
- valMarsh.initStaticHandlers(classBuilder, "VALUE_CLASS",
staticInitBuilder);
- }
-
- staticInitBuilder
- .nextControlFlow(
- "catch ($T | $T ex)",
- ReflectiveOperationException.class,
- SecurityException.class
- )
- .addStatement("throw new $T(ex)", IllegalStateException.class)
- .endControlFlow();
-
- classBuilder.addStaticBlock(staticInitBuilder.build());
- }
-
- /**
- * @param schema Schema descriptor.
- * @param keyMarsh Key marshaller code generator.
- * @param valMarsh Value marshaller code generator.
- * @return Tuple accembler factory method spec.
- */
- private MethodSpec generateTupleAsseblerFactoryMethod(SchemaDescriptor
schema, MarshallerCodeGenerator keyMarsh,
- MarshallerCodeGenerator valMarsh) {
- final MethodSpec.Builder builder = MethodSpec
- .methodBuilder("createAssembler")
- .addAnnotation(Override.class)
- .addModifiers(Modifier.PROTECTED, Modifier.FINAL)
- .addParameter(Object.class, "key", Modifier.FINAL)
- .addParameter(Object.class, "val", Modifier.FINAL)
- .returns(TupleAssembler.class)
-
- .addStatement("int varlenKeyCols = 0; int varlenValueCols = 0")
- .addStatement("int varlenKeyColsSize = 0; int varlenValueColsSize
= 0")
- .addStatement("$T keyCols = schema.keyColumns()", Columns.class)
- .addStatement("$T valCols = schema.valueColumns()", Columns.class);
-
- Columns keyCols = schema.keyColumns();
- if (keyCols.firstVarlengthColumn() >= 0) {
- final CodeBlock.Builder block = CodeBlock.builder().indent()
- .addStatement("$T fVal", Object.class);// Temporary vars.
-
- for (int i = keyCols.firstVarlengthColumn(); i < keyCols.length();
i++) {
- assert !keyCols.column(i).type().spec().fixedLength();
-
- block.addStatement("fVal = $L", keyMarsh.getValueCode("key",
i).toString());
-
- block.beginControlFlow("if (fVal != null)")
- .addStatement("varlenKeyColsSize += $T.getValueSize(fVal,
keyCols.column($L).type())", MarshallerUtil.class, i)
- .addStatement("varlenKeyCols++")
- .endControlFlow();
- }
- block.unindent();
-
- builder
- .addCode("{\n")
- .addCode(block.build())
- .addCode("}\n");
- }
-
- Columns valCols = schema.valueColumns();
- if (valCols.firstVarlengthColumn() >= 0) {
- final CodeBlock.Builder block = CodeBlock.builder().indent()
- .addStatement("$T fVal", Object.class);// Temporary vars.
-
- for (int i = valCols.firstVarlengthColumn(); i < valCols.length();
i++) {
- assert !valCols.column(i).type().spec().fixedLength();
-
- block.addStatement("fVal = $L", valMarsh.getValueCode("val",
i).toString());
-
- block.beginControlFlow("if (fVal != null)")
- .addStatement("varlenValueColsSize +=
$T.getValueSize(fVal, valCols.column($L).type())", MarshallerUtil.class, i)
- .addStatement("varlenValueCols++")
- .endControlFlow();
- }
- block.unindent();
-
- builder
- .addCode("{\n")
- .addCode(block.build())
- .addCode("}\n");
- }
-
- builder.addStatement("int size = $T.tupleSize(keyCols, varlenKeyCols,
varlenKeyColsSize," +
- "valCols, varlenValueCols, varlenValueColsSize)",
TupleAssembler.class);
-
- builder.addStatement("return new $T(schema, size, varlenKeyCols,
varlenValueCols)", TupleAssembler.class);
-
- return builder.build();
- }
-
- /**
- * @param valMarsh Value marshaller code generator.
- * @return Deserialize value method spec.
- */
- private MethodSpec generateDeserializeValueMethod(MarshallerCodeGenerator
valMarsh) {
- return MethodSpec
- .methodBuilder("deserializeValue0")
- .addAnnotation(Override.class)
- .addModifiers(Modifier.PROTECTED, Modifier.FINAL)
- .addParameter(Tuple.class, "tuple", Modifier.FINAL)
- .addException(SerializationException.class)
- .returns(TypeName.OBJECT)
-
- .beginControlFlow("try")
- .addCode(valMarsh.unmarshallObjectCode("tuple"))
- .nextControlFlow("catch($T th)", Throwable.class)
- .addStatement("throw new $T(th)", SerializationException.class)
- .endControlFlow()
- .build();
- }
-
- /**
- * @param keyMarsh Key marshaller code generator.
- * @return Deserialize key method spec.
- */
- private MethodSpec generateDeserializeKeyMethod(MarshallerCodeGenerator
keyMarsh) {
- return MethodSpec
- .methodBuilder("deserializeKey0")
- .addAnnotation(Override.class)
- .addModifiers(Modifier.PROTECTED, Modifier.FINAL)
- .addParameter(Tuple.class, "tuple", Modifier.FINAL)
- .addException(SerializationException.class)
- .returns(TypeName.OBJECT)
-
- .beginControlFlow("try")
- .addCode(keyMarsh.unmarshallObjectCode("tuple"))
- .nextControlFlow("catch($T th)", Throwable.class)
- .addStatement("throw new $T(th)", SerializationException.class)
- .endControlFlow()
- .build();
- }
-
- /**
- * @param keyMarsh Key marshaller code generator.
- * @param valMarsh Value marshaller code generator.
- * @return Serialize method spec.
- */
- private MethodSpec generateSerializeMethod(MarshallerCodeGenerator
keyMarsh, MarshallerCodeGenerator valMarsh) {
- return MethodSpec.
- methodBuilder("serialize0")
- .addAnnotation(Override.class)
- .addModifiers(Modifier.PROTECTED, Modifier.FINAL)
- .addParameter(TupleAssembler.class, "asm", Modifier.FINAL)
- .addParameter(TypeName.OBJECT, "key", Modifier.FINAL)
- .addParameter(TypeName.OBJECT, "val", Modifier.FINAL)
- .addException(SerializationException.class)
- .returns(ArrayTypeName.of(TypeName.BYTE))
-
- .beginControlFlow("try")
- .addCode(keyMarsh.marshallObjectCode("asm", "key"))
- .addCode(valMarsh.marshallObjectCode("asm", "val"))
- .addStatement("return asm.build()")
-
- .nextControlFlow("catch($T th)", Throwable.class)
- .addStatement("throw new $T(th)", SerializationException.class)
- .endControlFlow()
- .build();
- }
-
- /**
- * Creates marshaller code generator for given class.
- *
- * @param tClass Target class.
- * @param factoryRefVar Object factory variable.
- * @param columns Columns that tClass mapped to.
- * @param firstColIdx First column absolute index in schema.
- * @return Marshaller code generator.
- */
- private MarshallerCodeGenerator createObjectMarshaller(
- Class<?> tClass,
- @Nullable String factoryRefVar,
- Columns columns,
- int firstColIdx
- ) {
- BinaryMode mode = MarshallerUtil.mode(tClass);
-
- if (mode != null) // Simple type.
- return new
IdentityObjectMarshallerExprGenerator(TupleColumnAccessCodeGenerator.createAccessor(mode,
firstColIdx));
- else
- return new ObjectMarshallerCodeGenerator(tClass, factoryRefVar,
columns, firstColIdx);
- }
-}
diff --git
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/TupleColumnAccessCodeGenerator.java
b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/TupleColumnAccessCodeGenerator.java
deleted file mode 100644
index 3d7607f..0000000
---
a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/codegen/TupleColumnAccessCodeGenerator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.ignite.internal.schema.marshaller.codegen;
-
-import com.squareup.javapoet.CodeBlock;
-import java.util.BitSet;
-import java.util.UUID;
-import org.apache.ignite.internal.schema.marshaller.BinaryMode;
-
-/**
- * Tuple access code generator.
- */
-public class TupleColumnAccessCodeGenerator {
- /**
- * @param mode Binary mode.
- * @param colIdx Column index in schema.
- * @return Tuple column access code generator.
- */
- static TupleColumnAccessCodeGenerator createAccessor(BinaryMode mode, int
colIdx) {
- switch (mode) {
- case P_BYTE:
- return new TupleColumnAccessCodeGenerator("byteValue",
"appendByte", byte.class, colIdx);
- case P_SHORT:
- return new TupleColumnAccessCodeGenerator("shortValue",
"appendShort", short.class, colIdx);
- case P_INT:
- return new TupleColumnAccessCodeGenerator("intValue",
"appendInt", int.class, colIdx);
- case P_LONG:
- return new TupleColumnAccessCodeGenerator("longValue",
"appendLong", long.class, colIdx);
- case P_FLOAT:
- return new TupleColumnAccessCodeGenerator("floatValue",
"appendFloat", float.class, colIdx);
- case P_DOUBLE:
- return new TupleColumnAccessCodeGenerator("doubleValue",
"appendDouble", double.class, colIdx);
- case BYTE:
- return new TupleColumnAccessCodeGenerator("byteValueBoxed",
"appendByte", Byte.class, byte.class, colIdx);
- case SHORT:
- return new TupleColumnAccessCodeGenerator("shortValueBoxed",
"appendShort", Short.class, short.class, colIdx);
- case INT:
- return new TupleColumnAccessCodeGenerator("intValueBoxed",
"appendInt", Integer.class, int.class, colIdx);
- case LONG:
- return new TupleColumnAccessCodeGenerator("longValueBoxed",
"appendLong", Long.class, long.class, colIdx);
- case FLOAT:
- return new TupleColumnAccessCodeGenerator("floatValueBoxed",
"appendFloat", Float.class, float.class, colIdx);
- case DOUBLE:
- return new TupleColumnAccessCodeGenerator("doubleValueBoxed",
"appendDouble", Double.class, double.class, colIdx);
- case STRING:
- return new TupleColumnAccessCodeGenerator("stringValue",
"appendString", String.class, colIdx);
- case UUID:
- return new TupleColumnAccessCodeGenerator("uuidValue",
"appendUuid", UUID.class, colIdx);
- case BYTE_ARR:
- return new TupleColumnAccessCodeGenerator("bytesValue",
"appendBytes", byte[].class, colIdx);
- case BITSET:
- return new TupleColumnAccessCodeGenerator("bitmaskValue",
"appendBitmask", BitSet.class, colIdx);
- }
-
- throw new IllegalStateException("Unsupported binary mode: " + mode);
- }
-
- /** Reader handle name. */
- private final String readMethodName;
-
- /** Writer handle name. */
- private final String writeMethodName;
-
- /** Mapped value type. */
- private final Class<?> mappedType;
-
- /** Write method argument type. */
- private final Class<?> writeArgType;
-
- /** Column index in schema. */
- private final int colIdx;
-
- /**
- * Constructor.
- *
- * @param readMethodName Reader handle name.
- * @param writeMethodName Writer handle name.
- * @param mappedType Mapped value type.
- * @param colIdx Column index in schema.
- */
- TupleColumnAccessCodeGenerator(String readMethodName, String
writeMethodName, Class<?> mappedType, int colIdx) {
- this(readMethodName, writeMethodName, mappedType, mappedType, colIdx);
- }
-
- /**
- * Constructor.
- *
- * @param readMethodName Reader handle name.
- * @param writeMethodName Writer handle name.
- * @param mappedType Mapped value type.
- * @param writeArgType Write method argument type.
- * @param colIdx Column index in schema.
- */
- TupleColumnAccessCodeGenerator(String readMethodName, String
writeMethodName, Class<?> mappedType,
- Class<?> writeArgType, int colIdx) {
- this.readMethodName = readMethodName;
- this.writeMethodName = writeMethodName;
- this.colIdx = colIdx;
- this.mappedType = mappedType;
- this.writeArgType = writeArgType;
- }
-
- /**
- * @return Column index in schema.
- */
- public int columnIdx() {
- return colIdx;
- }
-
- /**
- * @param tuple Tuple.
- * @return Code that reads column value from tuple.
- */
- public CodeBlock read(String tuple) {
- return CodeBlock.of("($T)$L.$L($L)", mappedType, tuple,
readMethodName, colIdx);
- }
-
- /**
- * @param asmVar Tuple assembler var.
- * @param valExpr Value expression.
- * @return Code that writes value to tuple column.
- */
- public CodeBlock write(String asmVar, String valExpr) {
- if (mappedType.isPrimitive())
- return CodeBlock.builder().addStatement("$L.$L(($T)$L)", asmVar,
writeMethodName, writeArgType, valExpr).build();
- else {
- return CodeBlock.builder()
- .add("{\n").indent()
- .addStatement("Object fVal")
- .beginControlFlow("if((fVal = $L) == null)", valExpr)
- .addStatement("$L.appendNull()", asmVar)
- .nextControlFlow("else")
- .addStatement("$L.$L(($T)fVal)", asmVar, writeMethodName,
writeArgType)
- .endControlFlow()
- .unindent()
- .add("}\n")
- .build();
- }
- }
-
- public Class<?> mappedType() {
- return mappedType;
- }
-}
diff --git
a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
index cd56f99..af60cae 100644
---
a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
+++
b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
@@ -76,7 +76,7 @@ public class SerializerBenchmarkTest {
public int fieldsCount;
/** Serializer. */
- @Param({"Generated", "ASM", "Java"})
+ @Param({"ASM", "Java"})
public String serializerName;
/**
@@ -118,8 +118,6 @@ public class SerializerBenchmarkTest {
if ("Java".equals(serializerName))
serializer =
SerializerFactory.createJavaSerializerFactory().create(schema, Long.class,
valClass);
- else if ("ASM".equals(serializerName))
- serializer = new AsmSerializerGenerator().create(schema,
Long.class, valClass);
else
serializer =
SerializerFactory.createGeneratedSerializerFactory().create(schema, Long.class,
valClass);
}
diff --git
a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
index 8547c8e..082b047 100644
---
a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
+++
b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
@@ -36,7 +36,6 @@ import org.apache.ignite.internal.schema.NativeTypeSpec;
import org.apache.ignite.internal.schema.SchemaDescriptor;
import org.apache.ignite.internal.schema.TestUtils;
import org.apache.ignite.internal.schema.marshaller.asm.AsmSerializerGenerator;
-import
org.apache.ignite.internal.schema.marshaller.codegen.SerializerGenerator;
import
org.apache.ignite.internal.schema.marshaller.reflection.JavaSerializerFactory;
import org.apache.ignite.internal.util.ObjectFactory;
import org.junit.jupiter.api.BeforeEach;
@@ -71,7 +70,6 @@ public class JavaSerializerTest {
private static List<SerializerFactory> serializerFactoryProvider() {
return Arrays.asList(
new JavaSerializerFactory(),
- new SerializerGenerator(),
new AsmSerializerGenerator()
);
}