Dmitry Lychagin has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/1870
Change subject: [ASTERIXDB-1976][FUN] Invoke code generation from
asterix-runtime module
......................................................................
[ASTERIXDB-1976][FUN] Invoke code generation from asterix-runtime module
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Invoke function code generation from asterix-runtime module
instead of asterix-algebra module
Change-Id: I2bb9a2cef1d346242c65d76378fbbf0e18a94bfe
---
M asterixdb/asterix-algebra/pom.xml
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
A
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/CodeGenHelper.java
M
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
M
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
R
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.java
M asterixdb/asterix-runtime/pom.xml
14 files changed, 237 insertions(+), 158 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/70/1870/1
diff --git a/asterixdb/asterix-algebra/pom.xml
b/asterixdb/asterix-algebra/pom.xml
index 04f8d63..2cc9075 100644
--- a/asterixdb/asterix-algebra/pom.xml
+++ b/asterixdb/asterix-algebra/pom.xml
@@ -97,23 +97,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.apache.asterix</groupId>
- <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
- <version>${project.version}</version>
- <configuration>
-
<evaluatorPackagePrefix>org.apache.asterix.runtime.evaluators</evaluatorPackagePrefix>
- </configuration>
- <executions>
- <execution>
- <id>generate-evaluator</id>
- <phase>compile</phase>
- <goals>
- <goal>generate-evaluator</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
</plugins>
<pluginManagement>
<plugins>
@@ -129,19 +112,6 @@
<groupId>org.codehaus.mojo</groupId>
<artifactId>javacc-maven-plugin</artifactId>
<versionRange>[2.6,)</versionRange>
- <goals>
- <goal>javacc</goal>
- </goals>
- </pluginExecutionFilter>
- <action>
- <ignore />
- </action>
- </pluginExecution>
- <pluginExecution>
- <pluginExecutionFilter>
- <groupId>org.apache.asterix</groupId>
-
<artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
- <versionRange>(0.8.8-incubating,)</versionRange>
<goals>
<goal>javacc</goal>
</goals>
@@ -220,10 +190,6 @@
</dependency>
<dependency>
<groupId>org.apache.hyracks</groupId>
- <artifactId>hyracks-util</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.hyracks</groupId>
<artifactId>hyracks-dataflow-common</artifactId>
</dependency>
<dependency>
@@ -260,11 +226,6 @@
<dependency>
<groupId>org.apache.hyracks</groupId>
<artifactId>hyracks-dataflow-std</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.asterix</groupId>
- <artifactId>asterix-fuzzyjoin</artifactId>
- <version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hyracks</groupId>
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
index 92ca977..fa67e25 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
@@ -23,6 +23,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.apache.asterix.common.utils.CodeGenHelper;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import
org.apache.asterix.runtime.aggregates.collections.FirstElementAggregateDescriptor;
import
org.apache.asterix.runtime.aggregates.collections.ListifyAggregateDescriptor;
@@ -324,7 +325,6 @@
import
org.apache.asterix.runtime.evaluators.functions.temporal.UnixTimeFromTimeInMsDescriptor;
import
org.apache.asterix.runtime.evaluators.functions.temporal.YearMonthDurationGreaterThanComparatorDescriptor;
import
org.apache.asterix.runtime.evaluators.functions.temporal.YearMonthDurationLessThanComparatorDescriptor;
-import org.apache.asterix.runtime.evaluators.staticcodegen.CodeGenUtil;
import
org.apache.asterix.runtime.runningaggregates.std.TidRunningAggregateDescriptor;
import org.apache.asterix.runtime.unnestingfunctions.std.RangeDescriptor;
import
org.apache.asterix.runtime.unnestingfunctions.std.ScanCollectionDescriptor;
@@ -731,8 +731,8 @@
*/
private static IFunctionDescriptorFactory
getGeneratedFunctionDescriptorFactory(Class<?> cl) {
try {
- String className =
CodeGenUtil.getGeneratedFunctionDescriptorClassName(cl.getName(),
- CodeGenUtil.DEFAULT_SUFFIX_FOR_GENERATED_CLASS);
+ String className =
CodeGenHelper.getGeneratedClassName(cl.getName(),
+ CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS);
Class<?> generatedCl = cl.getClassLoader().loadClass(className);
Field factory = generatedCl.getDeclaredField(FACTORY);
return (IFunctionDescriptorFactory) factory.get(null);
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/CodeGenHelper.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/CodeGenHelper.java
new file mode 100644
index 0000000..b8397f2
--- /dev/null
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/CodeGenHelper.java
@@ -0,0 +1,93 @@
+/*
+ * 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.asterix.common.utils;
+
+public final class CodeGenHelper {
+
+ public final static String DEFAULT_SUFFIX_FOR_GENERATED_CLASS = "Gen";
+
+ private final static String DOLLAR = "$";
+
+ private final static String NESTED_CLASSNAME_PREFIX = "_";
+
+ public static String getGeneratedClassName(String originalClassName,
String suffixForGeneratedClass) {
+ return
toJdkStandardName(getGeneratedInternalClassName(originalClassName,
suffixForGeneratedClass));
+ }
+
+ public static String getGeneratedInternalClassName(String
originalClassName, String suffixForGeneratedClass) {
+ String originalFuncDescriptorClassInternalName =
toInternalClassName(originalClassName);
+ return generateClassName(originalFuncDescriptorClassInternalName,
suffixForGeneratedClass, 0);
+ }
+
+ /**
+ * Gets the name of a generated class.
+ *
+ * @param originalClassName,
+ * the original class, i.e., the source of the generated class.
+ * @param suffix,
+ * the suffix for the generated class.
+ * @param counter,
+ * a counter that appearing at the end of the name of the
generated class.
+ * @return the name of the generated class.
+ */
+ public static String generateClassName(String originalClassName, String
suffix, int counter) {
+ StringBuilder sb = new StringBuilder();
+ int end = originalClassName.indexOf(DOLLAR);
+ if (end < 0) {
+ end = originalClassName.length();
+ }
+
+ String name = originalClassName.substring(0, end);
+ sb.append(name);
+ sb.append(DOLLAR);
+ sb.append(NESTED_CLASSNAME_PREFIX);
+ sb.append(suffix);
+
+ if (counter > 0) {
+ sb.append(counter);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Converts an ASM class name to the JDK class naming format.
+ *
+ * @param name,
+ * a class name following the ASM convention.
+ * @return a "."-separated class name for JDK.
+ */
+ public static String toJdkStandardName(String name) {
+ return name.replace("/", ".");
+ }
+
+ /**
+ * Converts a JDK class name to the class naming format of ASM.
+ *
+ * @param name,
+ * a class name following the JDK convention.
+ * @return a "/"-separated class name assumed by ASM.
+ */
+ public static String toInternalClassName(String name) {
+ return name.replace(".", "/");
+ }
+
+ private CodeGenHelper() {
+ }
+}
diff --git
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
index a8ada2c..77ceb83 100644
---
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
+++
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
@@ -32,13 +32,30 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.10</version>
+ <configuration>
+ <ignoredUnusedDeclaredDependencies combine.children="append">
+
<ignoredUnusedDeclaredDependency>org.apache.asterix:asterix-om:*</ignoredUnusedDeclaredDependency>
+ </ignoredUnusedDeclaredDependencies>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
<dependencies>
<dependency>
<groupId>org.apache.asterix</groupId>
- <artifactId>asterix-runtime</artifactId>
- <type>jar</type>
+ <artifactId>asterix-common</artifactId>
<version>${project.version}</version>
- <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.asterix</groupId>
+ <artifactId>asterix-om</artifactId>
+ <version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
@@ -59,5 +76,15 @@
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-all</artifactId>
+ <version>5.1</version>
+ </dependency>
</dependencies>
</project>
diff --git
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
index 888df55..f402e5e 100644
---
a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
+++
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
@@ -22,21 +22,25 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.util.Set;
-import
org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.common.utils.CodeGenHelper;
import org.apache.asterix.runtime.evaluators.staticcodegen.CodeGenUtil;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.reflections.Reflections;
+import org.reflections.util.ConfigurationBuilder;
/**
* Statically generates null-handling byte code for scalar functions.
*
* @goal generate-evaluator
- * @phase compile
+ * @phase process-classes
*/
public class EvaluatorGeneratorMojo extends AbstractMojo {
@@ -62,23 +66,41 @@
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
baseDir = project.getBuild().getDirectory() + File.separator +
"classes";
- try {
- // Finds all sub-classes of
AbstractScalarFunctionDynamicDescriptor with in the package
- // org.apache.asterix.runtime.evaluators.
- Reflections reflections = new Reflections(evaluatorPackagePrefix);
- Set<Class<? extends AbstractScalarFunctionDynamicDescriptor>>
allClasses = reflections
-
.getSubTypesOf(AbstractScalarFunctionDynamicDescriptor.class);
- // Generates byte code for all sub-classes of
AbstractScalarFunctionDynamicDescriptor.
+ URLClassLoader classLoader = null;
+ try {
+ URI baseURI = new File(baseDir).toURI();
+ classLoader = new URLClassLoader(new URL[] { baseURI.toURL() },
getClass().getClassLoader());
+
+ String superClassName =
CodeGenHelper.toJdkStandardName(CodeGenUtil.DESCRIPTOR_SUPER_CLASS_NAME);
+ Class superClass = Class.forName(superClassName, false,
classLoader);
+
+ // Finds all sub-classes of the given root class within the
specified package
+ ConfigurationBuilder config =
ConfigurationBuilder.build(classLoader, evaluatorPackagePrefix);
+ String genSuffix =
CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS + ".class";
+ config.setInputsFilter(path -> path != null &&
!path.endsWith(genSuffix));
+
+ Reflections reflections = new Reflections(config);
+ Set<Class<?>> allClasses = reflections.getSubTypesOf(superClass);
+
+ // Generates byte code for all sub-classes
for (Class<?> cl : allClasses) {
getLog().info("Generating byte code for " + cl.getName());
CodeGenUtil.generateScalarFunctionDescriptorBinary(evaluatorPackagePrefix,
cl.getName(),
- CodeGenUtil.DEFAULT_SUFFIX_FOR_GENERATED_CLASS,
reflections.getClass().getClassLoader(),
+ CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS,
classLoader,
(name, bytes) -> writeFile(name, bytes));
}
} catch (Exception e) {
getLog().error(e);
throw new MojoFailureException(e.toString());
+ } finally {
+ if (classLoader != null) {
+ try {
+ classLoader.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
}
}
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
similarity index 74%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
index 87a9a84..9f632b4 100644
---
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
+++
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
@@ -27,6 +27,7 @@
import java.util.List;
import java.util.Set;
+import org.apache.asterix.common.utils.CodeGenHelper;
import org.apache.commons.lang3.tuple.Pair;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
@@ -36,15 +37,12 @@
*/
public class CodeGenUtil {
- public final static String DEFAULT_SUFFIX_FOR_GENERATED_CLASS = "Gen";
private final static String OBJECT_CLASS_NAME = "java/lang/Object";
- private final static String DESCRIPTOR_SUPER_CLASS_NAME =
"org/apache/asterix/runtime/"
- + "evaluators/base/AbstractScalarFunctionDynamicDescriptor";
+ public final static String DESCRIPTOR_SUPER_CLASS_NAME =
+
"org/apache/asterix/runtime/evaluators/base/AbstractScalarFunctionDynamicDescriptor";
private final static String EVALUATOR_FACTORY = "EvaluatorFactory";
private final static String EVALUATOR = "Evaluator";
private final static String INNER = "Inner";
- private final static String DOLLAR = "$";
- private final static String NESTED_CLASSNAME_PREFIX = "_";
/**
* The callback interface for a caller to determine what it needs to do for
@@ -81,31 +79,31 @@
public static List<Pair<String, String>>
generateScalarFunctionDescriptorBinary(String packagePrefix,
String originalFuncDescriptorClassName, String
suffixForGeneratedClass, ClassLoader classLoader,
ClassByteCodeAction action) throws IOException,
ClassNotFoundException {
- originalFuncDescriptorClassName =
toInternalClassName(originalFuncDescriptorClassName);
+ originalFuncDescriptorClassName =
CodeGenHelper.toInternalClassName(originalFuncDescriptorClassName);
if
(originalFuncDescriptorClassName.equals(DESCRIPTOR_SUPER_CLASS_NAME)) {
return Collections.emptyList();
}
- String targetFuncDescriptorClassName =
getGeneratedFunctionDescriptorInternalClassName(
- originalFuncDescriptorClassName, suffixForGeneratedClass);
+ String targetFuncDescriptorClassName =
+
CodeGenHelper.getGeneratedInternalClassName(originalFuncDescriptorClassName,
suffixForGeneratedClass);
// Adds the mapping of the old/new names of the function descriptor.
List<Pair<String, String>> nameMappings = new ArrayList<>();
// Generates code for super classes except java.lang.Object.
- Class<?> evaluatorClass = CodeGenUtil.class.getClassLoader()
- .loadClass(toJdkStandardName(originalFuncDescriptorClassName));
+ Class<?> evaluatorClass =
+
classLoader.loadClass(CodeGenHelper.toJdkStandardName(originalFuncDescriptorClassName));
nameMappings.addAll(generateScalarFunctionDescriptorBinary(packagePrefix,
evaluatorClass.getSuperclass().getName(),
suffixForGeneratedClass, classLoader, action));
nameMappings.add(Pair.of(originalFuncDescriptorClassName,
targetFuncDescriptorClassName));
-
nameMappings.add(Pair.of(toJdkStandardName(originalFuncDescriptorClassName),
- toJdkStandardName(targetFuncDescriptorClassName)));
+
nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(originalFuncDescriptorClassName),
+
CodeGenHelper.toJdkStandardName(targetFuncDescriptorClassName)));
// Gathers evaluator factory classes that are created in the function
descriptor.
ClassReader reader = new
ClassReader(getResourceStream(originalFuncDescriptorClassName, classLoader));
- GatherEvaluatorFactoryCreationVisitor evalFactoryCreationVisitor = new
GatherEvaluatorFactoryCreationVisitor(
- toInternalClassName(packagePrefix));
+ GatherEvaluatorFactoryCreationVisitor evalFactoryCreationVisitor =
+ new
GatherEvaluatorFactoryCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
reader.accept(evalFactoryCreationVisitor, 0);
Set<String> evaluatorFactoryClassNames =
evalFactoryCreationVisitor.getCreatedEvaluatorFactoryClassNames();
@@ -126,20 +124,6 @@
reader.accept(renamingVisitor, 0);
action.runAction(targetFuncDescriptorClassName, writer.toByteArray());
return nameMappings;
- }
-
- public static String getGeneratedFunctionDescriptorClassName(String
originalFuncDescriptorClassName,
- String suffixForGeneratedClass) {
- return
toJdkStandardName(getGeneratedFunctionDescriptorInternalClassName(originalFuncDescriptorClassName,
- suffixForGeneratedClass));
- }
-
- private static String
getGeneratedFunctionDescriptorInternalClassName(String
originalFuncDescriptorClassName,
- String suffixForGeneratedClass) {
- String originalFuncDescriptorClassInternalName =
toInternalClassName(originalFuncDescriptorClassName);
- String targetFuncDescriptorClassName =
getGeneratedClassName(originalFuncDescriptorClassInternalName,
- suffixForGeneratedClass, 0);
- return targetFuncDescriptorClassName;
}
/**
@@ -193,19 +177,19 @@
String originalEvaluatorFactoryClassName, String
suffixForGeneratedClass, int factoryCounter,
List<Pair<String, String>> nameMappings, ClassLoader classLoader,
ClassByteCodeAction action)
throws IOException, ClassNotFoundException {
- originalEvaluatorFactoryClassName =
toInternalClassName(originalEvaluatorFactoryClassName);
- String targetEvaluatorFactoryClassName =
getGeneratedClassName(originalEvaluatorFactoryClassName,
+ originalEvaluatorFactoryClassName =
CodeGenHelper.toInternalClassName(originalEvaluatorFactoryClassName);
+ String targetEvaluatorFactoryClassName =
CodeGenHelper.generateClassName(originalEvaluatorFactoryClassName,
EVALUATOR_FACTORY + suffixForGeneratedClass, factoryCounter);
// Adds the old/new names of the evaluator factory into the mapping.
nameMappings.add(Pair.of(originalEvaluatorFactoryClassName,
targetEvaluatorFactoryClassName));
-
nameMappings.add(Pair.of(toJdkStandardName(originalEvaluatorFactoryClassName),
- toJdkStandardName(targetEvaluatorFactoryClassName)));
+
nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(originalEvaluatorFactoryClassName),
+
CodeGenHelper.toJdkStandardName(targetEvaluatorFactoryClassName)));
// Gathers the class names of the evaluators that are created in the
evaluator factory.
ClassReader reader = new
ClassReader(getResourceStream(originalEvaluatorFactoryClassName, classLoader));
- GatherEvaluatorCreationVisitor evalCreationVisitor = new
GatherEvaluatorCreationVisitor(
- toInternalClassName(packagePrefix));
+ GatherEvaluatorCreationVisitor evalCreationVisitor =
+ new
GatherEvaluatorCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
reader.accept(evalCreationVisitor, 0);
Set<String> evaluatorClassNames =
evalCreationVisitor.getCreatedEvaluatorClassNames();
@@ -249,23 +233,22 @@
int evalCounter, List<Pair<String, String>> nameMappings,
ClassLoader classLoader,
ClassByteCodeAction action) throws IOException,
ClassNotFoundException {
// Convert class names.
- originalEvaluatorClassName =
toInternalClassName(originalEvaluatorClassName);
+ originalEvaluatorClassName =
CodeGenHelper.toInternalClassName(originalEvaluatorClassName);
if (originalEvaluatorClassName.equals(OBJECT_CLASS_NAME)) {
return;
}
- String targetEvaluatorClassName =
getGeneratedClassName(originalEvaluatorClassName,
+ String targetEvaluatorClassName =
CodeGenHelper.generateClassName(originalEvaluatorClassName,
EVALUATOR + suffixForGeneratedClass, evalCounter);
// Generates code for super classes except java.lang.Object.
- Class<?> evaluatorClass = CodeGenUtil.class.getClassLoader()
- .loadClass(toJdkStandardName(originalEvaluatorClassName));
+ Class<?> evaluatorClass =
classLoader.loadClass(CodeGenHelper.toJdkStandardName(originalEvaluatorClassName));
generateEvaluatorClassBinary(evaluatorClass.getSuperclass().getName(),
suffixForGeneratedClass, evalCounter,
nameMappings, classLoader, action);
// Adds name mapping.
nameMappings.add(Pair.of(originalEvaluatorClassName,
targetEvaluatorClassName));
- nameMappings.add(
- Pair.of(toJdkStandardName(originalEvaluatorClassName),
toJdkStandardName(targetEvaluatorClassName)));
+
nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(originalEvaluatorClassName),
+ CodeGenHelper.toJdkStandardName(targetEvaluatorClassName)));
ClassReader firstPassReader = new
ClassReader(getResourceStream(originalEvaluatorClassName, classLoader));
// Generates inner classes other than the evaluator.
@@ -285,11 +268,11 @@
// Injects null-handling byte code and output the class binary.
// Since we're going to add jump instructions, we have to let the
ClassWriter to
// automatically generate frames for JVM to verify the class.
- ClassWriter secondPassWriter = new ClassWriter(secondPassReader,
- ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
+ ClassWriter secondPassWriter =
+ new ClassWriter(secondPassReader, ClassWriter.COMPUTE_FRAMES |
ClassWriter.COMPUTE_MAXS);
RenameClassVisitor renamingVisitor = new
RenameClassVisitor(secondPassWriter, nameMappings);
- EvaluatorNullCheckVisitor nullHandlingVisitor = new
EvaluatorNullCheckVisitor(renamingVisitor,
- missingHandlingVisitor.getLastAddedLabel());
+ EvaluatorNullCheckVisitor nullHandlingVisitor =
+ new EvaluatorNullCheckVisitor(renamingVisitor,
missingHandlingVisitor.getLastAddedLabel());
secondPassReader.accept(nullHandlingVisitor, 0);
action.runAction(targetEvaluatorClassName,
secondPassWriter.toByteArray());
}
@@ -325,9 +308,10 @@
String suffix = INNER + suffixForGeneratedClass;
for (String innerClassName : innerClassNames) {
// adds name mapping.
- String targetInnerClassName =
getGeneratedClassName(innerClassName, suffix, counter++);
+ String targetInnerClassName =
CodeGenHelper.generateClassName(innerClassName, suffix, counter++);
nameMappings.add(Pair.of(innerClassName, targetInnerClassName));
- nameMappings.add(Pair.of(toJdkStandardName(innerClassName),
toJdkStandardName(targetInnerClassName)));
+
nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(innerClassName),
+ CodeGenHelper.toJdkStandardName(targetInnerClassName)));
// Renaming appearances of original class names.
ClassReader innerClassReader = new
ClassReader(getResourceStream(innerClassName, classLoader));
@@ -336,58 +320,6 @@
innerClassReader.accept(renamingVisitor, 0);
action.runAction(targetInnerClassName, writer.toByteArray());
}
- }
-
- /**
- * Converts a JDK class name to the class naming format of ASM.
- *
- * @param name,
- * a class name following the JDK convention.
- * @return a "/"-separated class name assumed by ASM.
- */
- private static String toInternalClassName(String name) {
- return name.replace(".", "/");
- }
-
- /**
- * Converts an ASM class name to the JDK class naming format.
- *
- * @param name,
- * a class name following the ASM convention.
- * @return a "."-separated class name for JDK.
- */
- private static String toJdkStandardName(String name) {
- return name.replace("/", ".");
- }
-
- /**
- * Gets the name of a generated class.
- *
- * @param originalClassName,
- * the original class, i.e., the source of the generated class.
- * @param suffix,
- * the suffix for the generated class.
- * @param counter,
- * a counter that appearing at the end of the name of the
generated class.
- * @return the name of the generated class.
- */
- private static String getGeneratedClassName(String originalClassName,
String suffix, int counter) {
- StringBuilder sb = new StringBuilder();
- int end = originalClassName.indexOf(DOLLAR);
- if (end < 0) {
- end = originalClassName.length();
- }
-
- String name = originalClassName.substring(0, end);
- sb.append(name);
- sb.append(DOLLAR);
- sb.append(NESTED_CLASSNAME_PREFIX);
- sb.append(suffix);
-
- if (counter > 0) {
- sb.append(counter);
- }
- return sb.toString();
}
/**
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
diff --git
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.java
b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.java
similarity index 100%
rename from
asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.java
rename to
asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.java
diff --git a/asterixdb/asterix-runtime/pom.xml
b/asterixdb/asterix-runtime/pom.xml
index 7f1fabd..6092cc5 100644
--- a/asterixdb/asterix-runtime/pom.xml
+++ b/asterixdb/asterix-runtime/pom.xml
@@ -35,6 +35,55 @@
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.asterix</groupId>
+ <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <configuration>
+
<evaluatorPackagePrefix>org.apache.asterix.runtime.evaluators</evaluatorPackagePrefix>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate-evaluator</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>generate-evaluator</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.apache.asterix</groupId>
+
<artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
+ <versionRange>(0.8.8-incubating,)</versionRange>
+ <goals>
+ <goal>generate-evaluator</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore />
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
<dependencies>
<dependency>
<groupId>org.apache.asterix</groupId>
@@ -133,11 +182,6 @@
<groupId>org.apache.asterix</groupId>
<artifactId>asterix-transactions</artifactId>
<version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-all</artifactId>
- <version>5.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
--
To view, visit https://asterix-gerrit.ics.uci.edu/1870
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2bb9a2cef1d346242c65d76378fbbf0e18a94bfe
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Dmitry Lychagin <[email protected]>