[NO ISSUE][OTH] Codegen clean up and plugin removal
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Remove the codegen related files.
- Remove the codegen plugin.
- Remove the codegen plugin dependency from pom files.
Change-Id: I2c17f9f3f0c73f2ec3048a39da3cbbdd5f24e816
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3396
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Hussain Towaileb <hussainht@gmail.com>
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
deleted file mode 100644
index b8397f2..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/CodeGenHelper.java
+++ /dev/null
@@ -1,93 +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.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-fuzzyjoin/pom.xml b/asterixdb/asterix-fuzzyjoin/pom.xml
index 5c31882..0eab9ed 100644
--- a/asterixdb/asterix-fuzzyjoin/pom.xml
+++ b/asterixdb/asterix-fuzzyjoin/pom.xml
@@ -41,23 +41,6 @@
<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>
- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
diff --git a/asterixdb/asterix-geo/pom.xml b/asterixdb/asterix-geo/pom.xml
index 81d7871..6b5c845 100644
--- a/asterixdb/asterix-geo/pom.xml
+++ b/asterixdb/asterix-geo/pom.xml
@@ -41,23 +41,6 @@
<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>
- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
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
deleted file mode 100644
index d5ad95c..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
+++ /dev/null
@@ -1,89 +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.
- !-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
- <parent>
- <groupId>org.apache.asterix</groupId>
- <artifactId>asterix-maven-plugins</artifactId>
- <version>0.9.5-SNAPSHOT</version>
- </parent>
-
- <packaging>maven-plugin</packaging>
- <name>asterix-evaluator-generator-maven-plugin</name>
-
- <properties>
- <root.dir>${basedir}/../..</root.dir>
- </properties>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <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-common</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.asterix</groupId>
- <artifactId>asterix-om</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-plugin-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-project</artifactId>
- </dependency>
- <dependency>
- <groupId>org.reflections</groupId>
- <artifactId>reflections</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-model</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm</artifactId>
- <version>6.2</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-tree</artifactId>
- <version>6.2</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
deleted file mode 100644
index 74084af..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/plugin/EvaluatorGeneratorMojo.java
+++ /dev/null
@@ -1,116 +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.asterix.runtime.evaluators.plugin;
-
-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.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 process-classes
- */
-public class EvaluatorGeneratorMojo extends AbstractMojo {
-
- private String baseDir;
-
- /**
- * @parameter default-value="${project}"
- * @required
- * @readonly
- */
- MavenProject project;
-
- /**
- * @parameter default-value="${evaluatorPackagePrefix}"
- * @required
- * @readonly
- */
- String evaluatorPackagePrefix;
-
- public EvaluatorGeneratorMojo() {
- }
-
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- baseDir = project.getBuild().getDirectory() + File.separator + "classes";
-
- 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(),
- 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) {
- getLog().error(e);
- }
- }
- }
- }
-
- private void writeFile(String name, byte[] classDefinitionBinary) throws IOException {
- File targetFile = new File(baseDir + File.separator + name + ".class");
- targetFile.getParentFile().mkdirs();
- targetFile.createNewFile();
- try (FileOutputStream outputStream = new FileOutputStream(targetFile)) {
- outputStream.write(classDefinitionBinary, 0, classDefinitionBinary.length);
- }
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index c396358..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/CodeGenUtil.java
+++ /dev/null
@@ -1,350 +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.asterix.runtime.evaluators.staticcodegen;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-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;
-
-/**
- * A utility class that generates byte code for scalar function descriptors.
- */
-public class CodeGenUtil {
-
- private final static String OBJECT_CLASS_NAME = "java/lang/Object";
- 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";
-
- /**
- * The callback interface for a caller to determine what it needs to do for
- * the generated class bytes.
- */
- public static interface ClassByteCodeAction {
-
- /**
- * Run a user-defined action for the generated class definition bytes.
- *
- * @param targetClassName,
- * the name for the generated class.
- * @param classDefinitionBytes,
- * the class definition bytes.
- * @throws IOException
- */
- public void runAction(String targetClassName, byte[] classDefinitionBytes) throws IOException;
- }
-
- /**
- * Generates the byte code for a scalar function descriptor.
- *
- * @param packagePrefix,
- * the prefix of evaluators for code generation.
- * @param originalFuncDescriptorClassName,
- * the original class name of the function descriptor.
- * @param suffixForGeneratedClass,
- * the suffix for the generated class.
- * @param action,
- * the customized action for the generated class definition bytes.
- * @throws IOException
- * @throws ClassNotFoundException
- */
- public static List<Pair<String, String>> generateScalarFunctionDescriptorBinary(String packagePrefix,
- String originalFuncDescriptorClassName, String suffixForGeneratedClass, ClassLoader classLoader,
- ClassByteCodeAction action) throws IOException, ClassNotFoundException {
- String internalFuncDescriptorClassName = CodeGenHelper.toInternalClassName(originalFuncDescriptorClassName);
- if (internalFuncDescriptorClassName.equals(DESCRIPTOR_SUPER_CLASS_NAME)) {
- return Collections.emptyList();
- }
-
- String targetFuncDescriptorClassName =
- CodeGenHelper.getGeneratedInternalClassName(internalFuncDescriptorClassName, 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 =
- classLoader.loadClass(CodeGenHelper.toJdkStandardName(internalFuncDescriptorClassName));
- nameMappings.addAll(generateScalarFunctionDescriptorBinary(packagePrefix,
- evaluatorClass.getSuperclass().getName(), suffixForGeneratedClass, classLoader, action));
-
- nameMappings.add(Pair.of(internalFuncDescriptorClassName, targetFuncDescriptorClassName));
- nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(internalFuncDescriptorClassName),
- CodeGenHelper.toJdkStandardName(targetFuncDescriptorClassName)));
-
- // Gathers evaluator factory classes that are created in the function descriptor.
- try (InputStream internalFuncDescriptorStream =
- getResourceStream(internalFuncDescriptorClassName, classLoader)) {
- ClassReader reader = new ClassReader(internalFuncDescriptorStream);
- GatherEvaluatorFactoryCreationVisitor evalFactoryCreationVisitor =
- new GatherEvaluatorFactoryCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
- reader.accept(evalFactoryCreationVisitor, 0);
- Set<String> evaluatorFactoryClassNames = evalFactoryCreationVisitor.getCreatedEvaluatorFactoryClassNames();
-
- // Generates inner classes other than evaluator factories.
- generateNonEvalInnerClasses(reader, evaluatorFactoryClassNames, nameMappings, suffixForGeneratedClass,
- classLoader, action);
-
- // Generates evaluator factories that are created in the function descriptor.
- int evalFactoryCounter = 0;
- for (String evaluateFactoryClassName : evaluatorFactoryClassNames) {
- generateEvaluatorFactoryClassBinary(packagePrefix, evaluateFactoryClassName, suffixForGeneratedClass,
- evalFactoryCounter++, nameMappings, classLoader, action);
- }
-
- // Transforms the function descriptor class and outputs the generated class binary.
- ClassWriter writer = new ClassWriter(reader, 0);
- RenameClassVisitor renamingVisitor = new RenameClassVisitor(writer, nameMappings);
- reader.accept(renamingVisitor, 0);
- action.runAction(targetFuncDescriptorClassName, writer.toByteArray());
- return nameMappings;
- }
- }
-
- /**
- * Apply mappings for a class name.
- *
- * @param nameMappings,
- * the mappings from existing class names to that of their generated counterparts.
- * @param inputStr,
- * the name of a class.
- * @return the name of the generated counterpart class.
- */
- static String applyMapping(List<Pair<String, String>> nameMappings, String inputStr) {
- if (inputStr == null) {
- return null;
- }
- String result = inputStr;
-
- // Applies name mappings in the reverse order, i.e.,
- // mapping recent added old/new name pairs first.
- int index = nameMappings.size() - 1;
- for (; index >= 0; --index) {
- Pair<String, String> entry = nameMappings.get(index);
- if (result.contains(entry.getLeft())) {
- return result.replace(entry.getLeft(), entry.getRight());
- }
- }
- return result;
- }
-
- /**
- * Generates the byte code for an evaluator factory class.
- *
- * @param packagePrefix,
- * the prefix of evaluators for code generation.
- * @param originalEvaluatorFactoryClassName,
- * the original evaluator factory class name.
- * @param suffixForGeneratedClass,
- * the suffix for the generated class.
- * @param factoryCounter,
- * the counter for the generated class.
- * @param nameMappings,
- * class names that needs to be rewritten in the generated byte code.
- * @param classLoader,
- * a class loader that has the original evaluator factory class in its resource paths.
- * @param action,
- * a user definition action for the generated byte code.
- * @throws IOException
- * @throws ClassNotFoundException
- */
- private static void generateEvaluatorFactoryClassBinary(String packagePrefix,
- String originalEvaluatorFactoryClassName, String suffixForGeneratedClass, int factoryCounter,
- List<Pair<String, String>> nameMappings, ClassLoader classLoader, ClassByteCodeAction action)
- throws IOException, ClassNotFoundException {
- String internalEvaluatorFactoryClassName = CodeGenHelper.toInternalClassName(originalEvaluatorFactoryClassName);
- String targetEvaluatorFactoryClassName = CodeGenHelper.generateClassName(internalEvaluatorFactoryClassName,
- EVALUATOR_FACTORY + suffixForGeneratedClass, factoryCounter);
-
- // Adds the old/new names of the evaluator factory into the mapping.
- nameMappings.add(Pair.of(internalEvaluatorFactoryClassName, targetEvaluatorFactoryClassName));
- nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(internalEvaluatorFactoryClassName),
- CodeGenHelper.toJdkStandardName(targetEvaluatorFactoryClassName)));
-
- // Gathers the class names of the evaluators that are created in the evaluator factory.
- try (InputStream internalEvaluatorFactoryStream =
- getResourceStream(internalEvaluatorFactoryClassName, classLoader)) {
- ClassReader reader = new ClassReader(internalEvaluatorFactoryStream);
- GatherEvaluatorCreationVisitor evalCreationVisitor =
- new GatherEvaluatorCreationVisitor(CodeGenHelper.toInternalClassName(packagePrefix));
- reader.accept(evalCreationVisitor, 0);
- Set<String> evaluatorClassNames = evalCreationVisitor.getCreatedEvaluatorClassNames();
-
- // Generates inner classes other than evaluators.
- generateNonEvalInnerClasses(reader, evaluatorClassNames, nameMappings, suffixForGeneratedClass, classLoader,
- action);
-
- // Generates code for all evaluators.
- int evalCounter = 0;
- for (String evaluateClassName : evaluatorClassNames) {
- generateEvaluatorClassBinary(evaluateClassName, suffixForGeneratedClass, evalCounter++, nameMappings,
- classLoader, action);
- }
-
- // Transforms the evaluator factory class and outputs the generated class binary.
- ClassWriter writer = new ClassWriter(reader, 0);
- RenameClassVisitor renamingVisitor = new RenameClassVisitor(writer, nameMappings);
- reader.accept(renamingVisitor, 0);
- action.runAction(targetEvaluatorFactoryClassName, writer.toByteArray());
- }
- }
-
- /**
- * Generates the byte code for an evaluator class.
- *
- * @param originalEvaluatorClassName,
- * the name of the original evaluator class.
- * @param suffixForGeneratedClass,
- * the suffix for the generated class.
- * @param evalCounter,
- * the counter for the generated class.
- * @param nameMappings,
- * class names that needs to be rewritten in the generated byte code.
- * @param classLoader,
- * a class loader that has the original evaluator factory class in its resource paths.
- * @param action,
- * a user definition action for the generated byte code.
- * @throws IOException
- * @throws ClassNotFoundException
- */
- private static void generateEvaluatorClassBinary(String originalEvaluatorClassName, String suffixForGeneratedClass,
- int evalCounter, List<Pair<String, String>> nameMappings, ClassLoader classLoader,
- ClassByteCodeAction action) throws IOException, ClassNotFoundException {
- // Convert class names.
- String internalEvaluatorClassName = CodeGenHelper.toInternalClassName(originalEvaluatorClassName);
- if (internalEvaluatorClassName.equals(OBJECT_CLASS_NAME)) {
- return;
- }
- String targetEvaluatorClassName = CodeGenHelper.generateClassName(internalEvaluatorClassName,
- EVALUATOR + suffixForGeneratedClass, evalCounter);
-
- // Generates code for super classes except java.lang.Object.
- Class<?> evaluatorClass = classLoader.loadClass(CodeGenHelper.toJdkStandardName(internalEvaluatorClassName));
- generateEvaluatorClassBinary(evaluatorClass.getSuperclass().getName(), suffixForGeneratedClass, evalCounter,
- nameMappings, classLoader, action);
-
- // Adds name mapping.
- nameMappings.add(Pair.of(internalEvaluatorClassName, targetEvaluatorClassName));
- nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(internalEvaluatorClassName),
- CodeGenHelper.toJdkStandardName(targetEvaluatorClassName)));
-
- try (InputStream internalEvaluatorStream = getResourceStream(internalEvaluatorClassName, classLoader)) {
- ClassReader firstPassReader = new ClassReader(internalEvaluatorStream);
- // Generates inner classes other than the evaluator.
- Set<String> excludedNames = new HashSet<>();
- for (Pair<String, String> entry : nameMappings) {
- excludedNames.add(entry.getKey());
- }
- generateNonEvalInnerClasses(firstPassReader, excludedNames, nameMappings, suffixForGeneratedClass,
- classLoader, action);
-
- // Injects missing-handling byte code.
- ClassWriter firstPassWriter = new ClassWriter(firstPassReader, 0);
- EvaluatorMissingCheckVisitor missingHandlingVisitor = new EvaluatorMissingCheckVisitor(firstPassWriter);
- firstPassReader.accept(missingHandlingVisitor, 0);
-
- ClassReader secondPassReader = new ClassReader(firstPassWriter.toByteArray());
- // 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);
- RenameClassVisitor renamingVisitor = new RenameClassVisitor(secondPassWriter, nameMappings);
- EvaluatorNullCheckVisitor nullHandlingVisitor =
- new EvaluatorNullCheckVisitor(renamingVisitor, missingHandlingVisitor.getLastAddedLabel());
- secondPassReader.accept(nullHandlingVisitor, 0);
- action.runAction(targetEvaluatorClassName, secondPassWriter.toByteArray());
- }
- }
-
- /**
- * Generates non-evaluator(-factory) inner classes defined in either a function descriptor
- * or an evaluator factory.
- *
- * @param reader,
- * the reader of the outer class.
- * @param evalClassNames,
- * the names of evaluator/evaluator-factory classes that shouldn't be generated in this
- * method.
- * @param nameMappings,
- * class names that needs to be rewritten in the generated byte code.
- * @param classLoader,
- * a class loader that has the original evaluator factory class in its resource paths.
- * @param action,
- * a user definition action for the generated byte code.
- * @throws IOException
- */
- private static void generateNonEvalInnerClasses(ClassReader reader, Set<String> evalClassNames,
- List<Pair<String, String>> nameMappings, String suffixForGeneratedClass, ClassLoader classLoader,
- ClassByteCodeAction action) throws IOException {
- // Gathers inner classes of the function descriptor.
- GatherInnerClassVisitor innerClassVisitor = new GatherInnerClassVisitor();
- reader.accept(innerClassVisitor, 0);
- Set<String> innerClassNames = innerClassVisitor.getInnerClassNames();
- innerClassNames.removeAll(evalClassNames);
-
- // Rewrites inner classes.
- int counter = 0;
- String suffix = INNER + suffixForGeneratedClass;
- for (String innerClassName : innerClassNames) {
- // adds name mapping.
- String targetInnerClassName = CodeGenHelper.generateClassName(innerClassName, suffix, counter++);
- nameMappings.add(Pair.of(innerClassName, targetInnerClassName));
- nameMappings.add(Pair.of(CodeGenHelper.toJdkStandardName(innerClassName),
- CodeGenHelper.toJdkStandardName(targetInnerClassName)));
-
- // Renaming appearances of original class names.
- try (InputStream innerStream = getResourceStream(innerClassName, classLoader)) {
- ClassReader innerClassReader = new ClassReader(innerStream);
- ClassWriter writer = new ClassWriter(innerClassReader, 0);
- RenameClassVisitor renamingVisitor = new RenameClassVisitor(writer, nameMappings);
- innerClassReader.accept(renamingVisitor, 0);
- action.runAction(targetInnerClassName, writer.toByteArray());
- }
- }
- }
-
- /**
- * Gets the input stream from a class file.
- *
- * @param className,
- * the name of a class.
- * @param classLoader,
- * the corresponding class loader.
- * @return the input stream.
- */
- private static InputStream getResourceStream(String className, ClassLoader classLoader) {
- return classLoader.getResourceAsStream(className.replace('.', '/') + ".class");
- }
-
- private CodeGenUtil() {
- }
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index 38b9751..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
+++ /dev/null
@@ -1,228 +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.asterix.runtime.evaluators.staticcodegen;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.FieldInsnNode;
-import org.objectweb.asm.tree.IincInsnNode;
-import org.objectweb.asm.tree.InsnNode;
-import org.objectweb.asm.tree.IntInsnNode;
-import org.objectweb.asm.tree.VarInsnNode;
-
-/**
- * This visitor adds missing-handling byte code into an evaluator class.
- */
-public class EvaluatorMissingCheckVisitor extends ClassVisitor {
- private static final String EVALUATE_DESC = "(Lorg/apache/hyracks/dataflow/common/data/"
- + "accessors/IFrameTupleReference;Lorg/apache/hyracks/data/std/api/IPointable;)V";
- private static final String EVALUATE = "evaluate";
- private static final MethodIdentifier METHOD_IDENTIFIER = new MethodIdentifier(EVALUATE, EVALUATE_DESC, null);
- private static final String TYPE_CHECKER_CLASS = "org/apache/asterix/runtime/evaluators/staticcodegen/TypeChecker";
- private static final String TYPE_CHECKER_DESC = "L" + TYPE_CHECKER_CLASS + ";";
- private static final String TYPE_CHECKER_NAME = "typeChecker";
- private static final String IS_MISSING = "isMissing";
- private static final String TYPECHECK_METHOD_DESC =
- "(Lorg/apache/hyracks/data/std/api/IPointable;" + "Lorg/apache/hyracks/data/std/api/IPointable;)Z";
- private static final String CONSTRUCTOR = "<init>";
- private String className = null;
- private Label lastAddedLabel = null;
-
- public EvaluatorMissingCheckVisitor(ClassVisitor downStreamVisitor) {
- super(Opcodes.ASM5, downStreamVisitor);
- }
-
- @Override
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- if (cv != null) {
- cv.visit(version, access, name, signature, superName, interfaces);
- }
- this.className = name;
- }
-
- @Override
- public void visitEnd() {
- if (cv != null) {
- cv.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL, TYPE_CHECKER_NAME, TYPE_CHECKER_DESC, null, null);
- cv.visitEnd();
- }
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
- if (!METHOD_IDENTIFIER.equals(new MethodIdentifier(name, desc, signature)) && !name.equals(CONSTRUCTOR)) {
- return mv;
- }
- if (name.equals(CONSTRUCTOR) && mv != null) {
- return new ConstructorVisitor(Opcodes.ASM5, mv);
- }
- if (mv != null) {
- return new InjectMissingCheckVisitor(Opcodes.ASM5, mv);
- }
- return null;
- }
-
- // Obtains the last added label.
- Label getLastAddedLabel() {
- return lastAddedLabel;
- }
-
- class ConstructorVisitor extends MethodVisitor {
-
- public ConstructorVisitor(int api, MethodVisitor mv) {
- super(api, mv);
- }
-
- @Override
- public void visitInsn(int opcode) {
- if (opcode != Opcodes.RETURN) {
- mv.visitInsn(opcode);
- return;
- }
- // Loads "this".
- mv.visitVarInsn(Opcodes.ALOAD, 0);
- // New TypeChecker.
- mv.visitTypeInsn(Opcodes.NEW, TYPE_CHECKER_CLASS);
- // Duplicate the top operand.
- mv.visitInsn(Opcodes.DUP);
- // Invoke the constructor of TypeChecker.
- mv.visitMethodInsn(Opcodes.INVOKESPECIAL, TYPE_CHECKER_CLASS, CONSTRUCTOR, "()V", false);
- // Putfield for the field typeChecker.
- mv.visitFieldInsn(Opcodes.PUTFIELD, className, TYPE_CHECKER_NAME, TYPE_CHECKER_DESC);
- // RETURN.
- mv.visitInsn(Opcodes.RETURN);
- }
- }
-
- class InjectMissingCheckVisitor extends MethodVisitor {
-
- private FieldInsnNode fieldAccessNode = null;
- private List<AbstractInsnNode> instructionsAfterFieldAccess = new ArrayList<>();
- private boolean updateToNextLabel = false;
-
- public InjectMissingCheckVisitor(int opcode, MethodVisitor mv) {
- super(opcode, mv);
- }
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- mv.visitFieldInsn(opcode, owner, name, desc);
- fieldAccessNode = new FieldInsnNode(opcode, owner, name, desc);
- instructionsAfterFieldAccess.clear();
- }
-
- @Override
- public void visitIincInsn(int var, int increment) {
- if (fieldAccessNode != null) {
- instructionsAfterFieldAccess.add(new IincInsnNode(var, increment));
- }
- super.visitIincInsn(var, increment);
- }
-
- @Override
- public void visitInsn(int opcode) {
- if (fieldAccessNode != null) {
- instructionsAfterFieldAccess.add(new InsnNode(opcode));
- }
- super.visitInsn(opcode);
- }
-
- @Override
- public void visitIntInsn(int opcode, int operand) {
- if (fieldAccessNode != null) {
- instructionsAfterFieldAccess.add(new IntInsnNode(opcode, operand));
- }
- super.visitIntInsn(opcode, operand);
- }
-
- @Override
- public void visitVarInsn(int opcode, int operand) {
- if (fieldAccessNode != null) {
- instructionsAfterFieldAccess.add(new VarInsnNode(opcode, operand));
- }
- super.visitVarInsn(opcode, operand);
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- mv.visitMethodInsn(opcode, owner, name, desc, itf);
- if (fieldAccessNode == null || !METHOD_IDENTIFIER.equals(new MethodIdentifier(name, desc, null))) {
- return;
- }
-
- // Loads the callee.
- mv.visitVarInsn(Opcodes.ALOAD, 0);
- mv.visitFieldInsn(Opcodes.GETFIELD, className, TYPE_CHECKER_NAME, TYPE_CHECKER_DESC);
-
- // Loads "this".
- mv.visitVarInsn(Opcodes.ALOAD, 0);
- // Replays the field access instruction.
- fieldAccessNode.accept(mv);
-
- // Replays other instruction between the field access and the evaluator call.
- for (AbstractInsnNode instruction : instructionsAfterFieldAccess) {
- instruction.accept(mv);
- }
-
- // Loads the result IPointable.
- mv.visitVarInsn(Opcodes.ALOAD, 2);
-
- // Invokes the missing check method.
- mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_CHECKER_CLASS, IS_MISSING, TYPECHECK_METHOD_DESC, false);
- lastAddedLabel = new Label();
- // Adds the if branch.
- mv.visitJumpInsn(Opcodes.IFEQ, lastAddedLabel);
- mv.visitInsn(Opcodes.RETURN);
- mv.visitLabel(lastAddedLabel);
- }
-
- @Override
- public void visitLabel(Label label) {
- if (updateToNextLabel) {
- lastAddedLabel = label;
- updateToNextLabel = false;
- }
- super.visitLabel(label);
- }
-
- @Override
- public void visitJumpInsn(int opcode, Label label) {
- super.visitJumpInsn(opcode, label);
- if (lastAddedLabel == null) {
- return;
- }
- try {
- if (label.getOffset() < lastAddedLabel.getOffset()) {
- // Backward jump, i.e., loop.
- updateToNextLabel = true;
- }
- } catch (IllegalStateException e) {
- // Forward jump, the offset is not available.
- }
- }
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index 84bc320..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
+++ /dev/null
@@ -1,105 +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.asterix.runtime.evaluators.staticcodegen;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This visitor adds null-handling byte code into an evaluator class.
- */
-public class EvaluatorNullCheckVisitor extends ClassVisitor {
- private final static String EVALUATE_DESC = "(Lorg/apache/hyracks/dataflow/common/data/accessors/"
- + "IFrameTupleReference;Lorg/apache/hyracks/data/std/api/IPointable;)V";
- private final static String EVALUATE = "evaluate";
- private final static MethodIdentifier METHOD_IDENTIFIER = new MethodIdentifier(EVALUATE, EVALUATE_DESC, null);
- private final static String TYPE_CHECKER_CLASS =
- "org/apache/asterix/runtime/evaluators/staticcodegen/" + "TypeChecker";
- private final static String TYPE_CHECKER_DESC = "L" + TYPE_CHECKER_CLASS + ";";
- private final static String TYPE_CHECKER_NAME = "typeChecker";
- private final static String IS_NULL = "isNull";
- private final static String TYPECHECK_METHOD_DESC = "(Lorg/apache/hyracks/data/std/api/IPointable;)Z";
- private String className = null;
- private final Label lastAddedLabel;
-
- public EvaluatorNullCheckVisitor(ClassVisitor downStreamVisitor, Label lastAddedLabel) {
- super(Opcodes.ASM5, downStreamVisitor);
- this.lastAddedLabel = lastAddedLabel;
- }
-
- @Override
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- if (cv != null) {
- cv.visit(version, access, name, signature, superName, interfaces);
- }
- this.className = name;
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
- if (!METHOD_IDENTIFIER.equals(new MethodIdentifier(name, desc, signature))) {
- return mv;
- }
- if (mv != null) {
- return new InjectNullCheckVisitor(Opcodes.ASM5, mv);
- }
- return null;
- }
-
- // Obtains the last added label.
- Label getLastAddedLabel() {
- return lastAddedLabel;
- }
-
- class InjectNullCheckVisitor extends MethodVisitor {
-
- public InjectNullCheckVisitor(int api, MethodVisitor mv) {
- super(api, mv);
- }
-
- @Override
- public void visitLabel(Label label) {
- // Emits the label.
- mv.visitLabel(label);
-
- // Injects null-handling after the last missing-handling byte code.
- if (lastAddedLabel == null || lastAddedLabel.getOffset() != label.getOffset()) {
- return;
- }
-
- // Loads the callee.
- mv.visitVarInsn(Opcodes.ALOAD, 0);
- mv.visitFieldInsn(Opcodes.GETFIELD, className, TYPE_CHECKER_NAME, TYPE_CHECKER_DESC);
-
- // Loads the result IPointable.
- mv.visitVarInsn(Opcodes.ALOAD, 2);
-
- // Invokes the null check method.
- mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_CHECKER_CLASS, IS_NULL, TYPECHECK_METHOD_DESC, false);
- Label notNull = new Label();
- // Adds the if branch.
- mv.visitJumpInsn(Opcodes.IFEQ, notNull);
- mv.visitInsn(Opcodes.RETURN);
- mv.visitLabel(notNull);
- }
- }
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index 17f60ee..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorCreationVisitor.java
+++ /dev/null
@@ -1,67 +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.asterix.runtime.evaluators.staticcodegen;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This visitor gathers all created evaluators in an evaluator factory.
- */
-public class GatherEvaluatorCreationVisitor extends ClassVisitor {
-
- private static final String METHOD_NAME = "createScalarEvaluator";
- private Set<String> createdEvaluatorClassNames = new HashSet<>();
- private String ownerPrefix;
-
- public GatherEvaluatorCreationVisitor(String ownerPrefix) {
- super(Opcodes.ASM5);
- this.ownerPrefix = ownerPrefix;
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- if (!name.equals(METHOD_NAME)) {
- return null;
- }
- return new MethodVisitor(Opcodes.ASM5, null) {
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- if (opcode != Opcodes.INVOKESPECIAL) {
- return;
- }
- if (owner.startsWith(ownerPrefix)) {
- createdEvaluatorClassNames.add(owner);
- }
- }
- };
-
- }
-
- public Set<String> getCreatedEvaluatorClassNames() {
- return createdEvaluatorClassNames;
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index eeeb313..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherEvaluatorFactoryCreationVisitor.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.asterix.runtime.evaluators.staticcodegen;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This visitor gathers all created evaluator factories in a scalar function descriptor.
- */
-public class GatherEvaluatorFactoryCreationVisitor extends ClassVisitor {
-
- private static final String METHOD_NAME = "createEvaluatorFactory";
- private final Set<String> createdEvaluatorFactoryClassNames = new HashSet<>();
- private String ownerPrefix;
-
- public GatherEvaluatorFactoryCreationVisitor(String ownerPrefix) {
- super(Opcodes.ASM5);
- this.ownerPrefix = ownerPrefix;
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- if (!name.equals(METHOD_NAME)) {
- return null;
- }
- return new MethodVisitor(Opcodes.ASM5, null) {
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- if (opcode != Opcodes.INVOKESPECIAL) {
- return;
- }
- if (owner.startsWith(ownerPrefix)) {
- createdEvaluatorFactoryClassNames.add(owner);
- }
- }
- };
- }
-
- public Set<String> getCreatedEvaluatorFactoryClassNames() {
- return createdEvaluatorFactoryClassNames;
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index dfd189f..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/GatherInnerClassVisitor.java
+++ /dev/null
@@ -1,55 +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.asterix.runtime.evaluators.staticcodegen;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This class gathers all inner classes defined in a class.
- */
-public class GatherInnerClassVisitor extends ClassVisitor {
-
- private final Set<String> innerClassNames = new HashSet<>();
- private String className = null;
-
- public GatherInnerClassVisitor() {
- super(Opcodes.ASM5);
- }
-
- @Override
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- className = name;
- }
-
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- if ((!name.equals(className)) && ((access & Opcodes.ACC_PUBLIC) == 0 || (access & Opcodes.ACC_STATIC) == 0)) {
- innerClassNames.add(name);
- }
- }
-
- public Set<String> getInnerClassNames() {
- return innerClassNames;
- }
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index c37b93e..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/MethodIdentifier.java
+++ /dev/null
@@ -1,57 +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.asterix.runtime.evaluators.staticcodegen;
-
-/**
- * The data structure that can uniquely identify a method.
- */
-public class MethodIdentifier {
-
- private final String name;
- private final String desc;
- private final String signature;
-
- public MethodIdentifier(String name, String desc, String signature) {
- this.name = name == null ? "" : name;
- this.desc = desc == null ? "" : desc;
- this.signature = signature == null ? "" : signature;
- }
-
- @Override
- public int hashCode() {
- return name.hashCode() * desc.hashCode() * signature.hashCode();
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof MethodIdentifier)) {
- return false;
- }
- MethodIdentifier methodIdentifier = (MethodIdentifier) o;
- return name.equals(methodIdentifier.name) && desc.equals(methodIdentifier.desc)
- && signature.equals(methodIdentifier.signature);
- }
-
- @Override
- public String toString() {
- return name + ":" + desc + ":" + signature;
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/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
deleted file mode 100644
index 4396fd6..0000000
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/RenameClassVisitor.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.asterix.runtime.evaluators.staticcodegen;
-
-import java.util.List;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This visitor replaces all the appearances of original class names with
- * new (generated) class names, according to an input name mapping.
- */
-public class RenameClassVisitor extends ClassVisitor {
-
- private final List<Pair<String, String>> nameMapping;
-
- public RenameClassVisitor(ClassVisitor downStreamVisitor, List<Pair<String, String>> nameMapping) {
- super(Opcodes.ASM5, downStreamVisitor);
- this.nameMapping = nameMapping;
- }
-
- @Override
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- super.visit(version, access, applyMapping(name), signature, applyMapping(superName), interfaces);
- }
-
- @Override
- public void visitOuterClass(String owner, String name, String desc) {
- // Skips outer class descriptions.
- }
-
- @Override
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- if ((access & Opcodes.ACC_PUBLIC) != 0 && (access & Opcodes.ACC_STATIC) != 0) {
- super.visitInnerClass(name, outerName, innerName, access);
- }
- }
-
- @Override
- public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
- return cv.visitField(access, name, applyMapping(desc), applyMapping(signature), value);
- }
-
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- MethodVisitor mv = cv.visitMethod(access, name, applyMapping(desc), applyMapping(signature), exceptions);
- if (mv != null) {
- return new MethodVisitor(Opcodes.ASM5, mv) {
-
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- mv.visitFieldInsn(opcode, applyMapping(owner), applyMapping(name), applyMapping(desc));
- }
-
- @Override
- public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
- mv.visitMethodInsn(opcode, applyMapping(owner), name, applyMapping(desc), itf);
- }
-
- @Override
- public void visitLocalVariable(String name, String desc, String signature, Label start, Label end,
- int index) {
- mv.visitLocalVariable(name, applyMapping(desc), applyMapping(signature), start, end, index);
- }
-
- @Override
- public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
- if (local != null) {
- for (int index = 0; index < local.length; ++index) {
- if (local[index] instanceof String) {
- local[index] = applyMapping((String) local[index]);
- }
- }
- }
- mv.visitFrame(type, nLocal, local, nStack, stack);
- }
-
- @Override
- public void visitTypeInsn(int opcode, String type) {
- mv.visitTypeInsn(opcode, applyMapping(type));
- }
-
- };
- }
- return null;
- }
-
- private String applyMapping(String inputStr) {
- return CodeGenUtil.applyMapping(nameMapping, inputStr);
- }
-
-}
diff --git a/asterixdb/asterix-maven-plugins/pom.xml b/asterixdb/asterix-maven-plugins/pom.xml
index 6f8558e..d7e6f6e 100644
--- a/asterixdb/asterix-maven-plugins/pom.xml
+++ b/asterixdb/asterix-maven-plugins/pom.xml
@@ -44,7 +44,6 @@
<modules>
<module>lexer-generator-maven-plugin</module>
<module>record-manager-generator-maven-plugin</module>
- <module>asterix-evaluator-generator-maven-plugin</module>
<module>asterix-test-datagenerator-maven-plugin</module>
<module>asterix-grammar-extension-maven-plugin</module>
</modules>
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionCollection.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionCollection.java
index 90c742c..9119520 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionCollection.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionCollection.java
@@ -20,8 +20,7 @@
import java.io.Serializable;
+@FunctionalInterface
public interface IFunctionCollection extends Serializable {
void add(IFunctionDescriptorFactory descriptorFactory);
-
- void addGenerated(IFunctionDescriptorFactory descriptorFactory);
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 2aed755..be4937e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -19,12 +19,10 @@
package org.apache.asterix.runtime.functions;
-import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
-import org.apache.asterix.common.utils.CodeGenHelper;
import org.apache.asterix.om.functions.IFunctionCollection;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.functions.IFunctionRegistrant;
@@ -533,8 +531,6 @@
public final class FunctionCollection implements IFunctionCollection {
private static final long serialVersionUID = -8308873930697425307L;
- private static final String FACTORY = "FACTORY";
-
private final ArrayList<IFunctionDescriptorFactory> descriptorFactories = new ArrayList<>();
@Override
@@ -542,11 +538,6 @@
descriptorFactories.add(descriptorFactory);
}
- @Override
- public void addGenerated(IFunctionDescriptorFactory descriptorFactory) {
- add(getGeneratedFunctionDescriptorFactory(descriptorFactory.createFunctionDescriptor().getClass()));
- }
-
public static FunctionCollection createDefaultFunctionCollection() {
FunctionCollection fc = new FunctionCollection();
@@ -1128,24 +1119,4 @@
public List<IFunctionDescriptorFactory> getFunctionDescriptorFactories() {
return descriptorFactories;
}
-
- /**
- * Gets the generated function descriptor factory from an <code>IFunctionDescriptor</code>
- * implementation class.
- *
- * @param cl,
- * the class of an <code>IFunctionDescriptor</code> implementation.
- * @return the IFunctionDescriptorFactory instance defined in the class.
- */
- private static IFunctionDescriptorFactory getGeneratedFunctionDescriptorFactory(Class<?> cl) {
- try {
- 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);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- }
}
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index decf7e7..3e65e5f 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -386,19 +386,6 @@
</pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
- <groupId>org.apache.asterix</groupId>
- <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
- <versionRange>[0.0,)</versionRange>
- <goals>
- <goal>generate-evaluator</goal>
- </goals>
- </pluginExecutionFilter>
- <action>
- <ignore />
- </action>
- </pluginExecution>
- <pluginExecution>
- <pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<versionRange>[0.0,)</versionRange>