Return-Path: X-Original-To: apmail-tajo-commits-archive@minotaur.apache.org Delivered-To: apmail-tajo-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3571E11B7F for ; Sat, 23 Aug 2014 17:37:52 +0000 (UTC) Received: (qmail 81587 invoked by uid 500); 23 Aug 2014 17:37:52 -0000 Delivered-To: apmail-tajo-commits-archive@tajo.apache.org Received: (qmail 81521 invoked by uid 500); 23 Aug 2014 17:37:52 -0000 Mailing-List: contact commits-help@tajo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tajo.apache.org Delivered-To: mailing list commits@tajo.apache.org Received: (qmail 80794 invoked by uid 99); 23 Aug 2014 17:37:51 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 23 Aug 2014 17:37:51 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 9EB779556C4; Sat, 23 Aug 2014 17:37:51 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hyunsik@apache.org To: commits@tajo.apache.org Date: Sat, 23 Aug 2014 17:38:14 -0000 Message-Id: <933d9f7c670843a794ca94988f5e7ec6@git.apache.org> In-Reply-To: <0000f2c7b76449da8fdb57b99ff9d21f@git.apache.org> References: <0000f2c7b76449da8fdb57b99ff9d21f@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [25/25] git commit: TAJO-906: Runtime code generation for evaluating expression trees. TAJO-906: Runtime code generation for evaluating expression trees. Closes #113 Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/7603a3d4 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/7603a3d4 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/7603a3d4 Branch: refs/heads/master Commit: 7603a3d4c9ebf1e98a9f2aba53ae1140cdd34497 Parents: 839081a Author: Hyunsik Choi Authored: Sun Aug 24 02:36:37 2014 +0900 Committer: Hyunsik Choi Committed: Sun Aug 24 02:36:37 2014 +0900 ---------------------------------------------------------------------- CHANGES | 3 + LICENSE | 31 + pom.xml | 52 +- tajo-algebra/pom.xml | 13 +- tajo-catalog/pom.xml | 12 +- tajo-catalog/tajo-catalog-client/pom.xml | 13 +- tajo-catalog/tajo-catalog-common/pom.xml | 13 +- .../org/apache/tajo/catalog/CatalogUtil.java | 2 +- .../org/apache/tajo/catalog/FunctionDesc.java | 2 +- tajo-catalog/tajo-catalog-drivers/pom.xml | 11 +- .../tajo-catalog-drivers/tajo-hcatalog/pom.xml | 19 +- tajo-catalog/tajo-catalog-server/pom.xml | 20 +- tajo-client/pom.xml | 14 +- tajo-common/pom.xml | 13 +- .../main/java/org/apache/tajo/SessionVars.java | 2 +- .../java/org/apache/tajo/conf/TajoConf.java | 2 +- .../java/org/apache/tajo/datum/CharDatum.java | 5 +- .../main/java/org/apache/tajo/datum/Datum.java | 4 + .../org/apache/tajo/datum/DatumFactory.java | 32 +- .../java/org/apache/tajo/datum/Inet4Datum.java | 5 + .../java/org/apache/tajo/datum/NullDatum.java | 5 + .../org/apache/tajo/util/CommonTestingUtil.java | 24 +- .../main/java/org/apache/tajo/util/Pair.java | 14 +- .../apache/tajo/util/datetime/DateTimeUtil.java | 35 + tajo-core/pom.xml | 34 +- .../tajo/engine/codegen/CaseWhenEmitter.java | 210 ++ .../engine/codegen/CaseWhenSwitchGenerator.java | 92 + .../tajo/engine/codegen/CodeGenUtils.java | 41 + .../tajo/engine/codegen/CompilationError.java | 31 + .../tajo/engine/codegen/EvalCodeEmitter.java | 27 + .../tajo/engine/codegen/EvalCodeGenContext.java | 223 ++ .../tajo/engine/codegen/EvalCodeGenerator.java | 840 ++++++ .../engine/codegen/ExecutorPreCompiler.java | 213 ++ .../tajo/engine/codegen/TajoClassLoader.java | 30 + .../engine/codegen/TajoGeneratorAdapter.java | 953 +++++++ .../engine/codegen/VariablesPreBuilder.java | 83 + .../org/apache/tajo/engine/eval/BinaryEval.java | 1 + .../org/apache/tajo/engine/eval/EvalNode.java | 2 - .../apache/tajo/engine/eval/EvalTreeUtil.java | 16 +- .../org/apache/tajo/engine/eval/EvalType.java | 10 + .../apache/tajo/engine/eval/FunctionEval.java | 11 +- .../tajo/engine/eval/LikePredicateEval.java | 4 + .../engine/eval/PatternMatchPredicateEval.java | 8 + .../engine/eval/SimilarToPredicateEval.java | 5 + .../tajo/engine/eval/SimpleEvalNodeVisitor.java | 3 - .../function/builtin/CoalesceBoolean.java | 4 +- .../engine/function/builtin/CoalesceDate.java | 3 +- .../engine/function/builtin/CoalesceDouble.java | 3 +- .../engine/function/builtin/CoalesceLong.java | 3 +- .../engine/function/builtin/CoalesceString.java | 3 +- .../engine/function/builtin/CoalesceTime.java | 3 +- .../function/builtin/CoalesceTimestamp.java | 3 +- .../tajo/engine/planner/ExprAnnotator.java | 15 +- .../engine/planner/PhysicalPlannerImpl.java | 4 + .../apache/tajo/engine/planner/Projector.java | 33 +- .../tajo/engine/planner/logical/HavingNode.java | 15 +- .../tajo/engine/planner/logical/ScanNode.java | 12 +- .../engine/planner/logical/SelectableNode.java | 48 + .../engine/planner/logical/SelectionNode.java | 15 +- .../engine/planner/physical/BNLJoinExec.java | 9 +- .../planner/physical/BSTIndexScanExec.java | 2 +- .../physical/BasicPhysicalExecutorVisitor.java | 2 + .../planner/physical/BinaryPhysicalExec.java | 2 + .../planner/physical/ExternalSortExec.java | 1 + .../planner/physical/HashFullOuterJoinExec.java | 8 +- .../engine/planner/physical/HashJoinExec.java | 7 +- .../planner/physical/HashLeftOuterJoinExec.java | 7 +- .../planner/physical/HashLeftSemiJoinExec.java | 4 + .../physical/MergeFullOuterJoinExec.java | 7 +- .../engine/planner/physical/MergeJoinExec.java | 7 +- .../engine/planner/physical/NLJoinExec.java | 2 +- .../planner/physical/NLLeftOuterJoinExec.java | 2 +- .../physical/PartitionMergeScanExec.java | 5 +- .../engine/planner/physical/PhysicalExec.java | 11 +- .../physical/PhysicalExecutorVisitor.java | 2 + .../planner/physical/PhysicalPlanUtil.java | 1 + .../physical/PhysicalPlanningException.java | 31 - .../engine/planner/physical/ProjectionExec.java | 2 +- .../physical/RightOuterMergeJoinExec.java | 7 +- .../engine/planner/physical/SelectionExec.java | 8 +- .../engine/planner/physical/SeqScanExec.java | 34 +- .../planner/physical/UnaryPhysicalExec.java | 5 + .../tajo/engine/query/QueryUnitRequestImpl.java | 2 +- .../org/apache/tajo/master/GlobalEngine.java | 14 +- .../tajo/master/LaunchTaskRunnersEvent.java | 45 + .../apache/tajo/master/TajoContainerProxy.java | 10 +- .../java/org/apache/tajo/master/TajoMaster.java | 2 +- .../tajo/master/querymaster/QueryMaster.java | 1 - .../tajo/master/querymaster/SubQuery.java | 7 +- .../worker/ExecutionBlockSharedResource.java | 139 + .../tajo/worker/TajoResourceAllocator.java | 14 +- .../java/org/apache/tajo/worker/TajoWorker.java | 31 +- .../tajo/worker/TajoWorkerManagerService.java | 20 +- .../main/java/org/apache/tajo/worker/Task.java | 61 +- .../apache/tajo/worker/TaskAttemptContext.java | 30 +- .../src/main/proto/TajoWorkerProtocol.proto | 3 + .../apache/tajo/LocalTajoTestingUtility.java | 6 +- .../org/apache/tajo/TajoTestingCluster.java | 8 +- .../engine/codegen/TestEvalCodeGenerator.java | 311 ++ .../engine/codegen/TestGeneratorAdapter.java | 41 + .../apache/tajo/engine/eval/ExprTestBase.java | 83 +- .../apache/tajo/engine/eval/TestPredicates.java | 17 + .../tajo/engine/eval/TestSQLExpression.java | 24 +- .../function/TestConditionalExpressions.java | 123 +- .../function/TestPatternMatchingPredicates.java | 2 +- .../planner/physical/TestPhysicalPlanner.java | 6 +- .../org/apache/tajo/worker/TestFetcher.java | 13 +- .../TestTajoCli/testHelpSessionVars.result | 1 + tajo-dist/pom.xml | 22 + tajo-dist/src/main/bin/tajo | 4 +- tajo-docs/pom.xml | 18 + tajo-jdbc/pom.xml | 13 +- .../org/apache/tajo/jdbc/MetaDataTuple.java | 6 + tajo-maven-plugins/pom.xml | 12 + tajo-project/pom.xml | 23 +- tajo-rpc/pom.xml | 12 + tajo-storage/pom.xml | 18 +- .../org/apache/tajo/storage/FrameTuple.java | 6 + .../java/org/apache/tajo/storage/LazyTuple.java | 9 +- .../java/org/apache/tajo/storage/Tuple.java | 3 + .../java/org/apache/tajo/storage/VTuple.java | 6 + .../tajo/storage/parquet/ParquetAppender.java | 11 +- .../tajo/storage/parquet/TestReadWrite.java | 7 +- tajo-thirdparty/asm/pom.xml | 180 ++ .../org/objectweb/asm/AnnotationVisitor.java | 169 ++ .../org/objectweb/asm/AnnotationWriter.java | 318 +++ .../tajo/org/objectweb/asm/Attribute.java | 255 ++ .../tajo/org/objectweb/asm/ByteVector.java | 312 ++ .../tajo/org/objectweb/asm/ClassReader.java | 2202 ++++++++++++++ .../tajo/org/objectweb/asm/ClassVisitor.java | 286 ++ .../tajo/org/objectweb/asm/ClassWriter.java | 1706 +++++++++++ .../apache/tajo/org/objectweb/asm/Context.java | 110 + .../org/apache/tajo/org/objectweb/asm/Edge.java | 75 + .../tajo/org/objectweb/asm/FieldVisitor.java | 121 + .../tajo/org/objectweb/asm/FieldWriter.java | 273 ++ .../apache/tajo/org/objectweb/asm/Frame.java | 1453 ++++++++++ .../apache/tajo/org/objectweb/asm/Handle.java | 170 ++ .../apache/tajo/org/objectweb/asm/Handler.java | 121 + .../org/apache/tajo/org/objectweb/asm/Item.java | 311 ++ .../apache/tajo/org/objectweb/asm/Label.java | 560 ++++ .../tajo/org/objectweb/asm/MethodVisitor.java | 662 +++++ .../tajo/org/objectweb/asm/MethodWriter.java | 2685 ++++++++++++++++++ .../apache/tajo/org/objectweb/asm/Opcodes.java | 358 +++ .../org/apache/tajo/org/objectweb/asm/Type.java | 895 ++++++ .../tajo/org/objectweb/asm/attrs/package.html | 66 + .../objectweb/asm/commons/AdviceAdapter.java | 625 ++++ .../objectweb/asm/commons/AnalyzerAdapter.java | 920 ++++++ .../asm/commons/CodeSizeEvaluator.java | 217 ++ .../objectweb/asm/commons/GeneratorAdapter.java | 1641 +++++++++++ .../asm/commons/InstructionAdapter.java | 1090 +++++++ .../asm/commons/JSRInlinerAdapter.java | 746 +++++ .../asm/commons/LocalVariablesSorter.java | 361 +++ .../tajo/org/objectweb/asm/commons/Method.java | 282 ++ .../org/objectweb/asm/commons/Remapper.java | 223 ++ .../asm/commons/RemappingAnnotationAdapter.java | 79 + .../asm/commons/RemappingClassAdapter.java | 126 + .../asm/commons/RemappingFieldAdapter.java | 62 + .../asm/commons/RemappingMethodAdapter.java | 161 ++ .../asm/commons/RemappingSignatureAdapter.java | 155 + .../asm/commons/SerialVersionUIDAdder.java | 533 ++++ .../objectweb/asm/commons/SimpleRemapper.java | 69 + .../objectweb/asm/commons/StaticInitMerger.java | 96 + .../asm/commons/TableSwitchGenerator.java | 57 + .../asm/commons/TryCatchBlockSorter.java | 92 + .../tajo/org/objectweb/asm/commons/package.html | 66 + .../optimizer/AnnotationConstantsCollector.java | 147 + .../asm/optimizer/ClassConstantsCollector.java | 184 ++ .../objectweb/asm/optimizer/ClassOptimizer.java | 167 ++ .../org/objectweb/asm/optimizer/Constant.java | 323 +++ .../objectweb/asm/optimizer/ConstantPool.java | 249 ++ .../asm/optimizer/FieldConstantsCollector.java | 75 + .../objectweb/asm/optimizer/JarOptimizer.java | 234 ++ .../asm/optimizer/MethodConstantsCollector.java | 161 ++ .../asm/optimizer/MethodOptimizer.java | 167 ++ .../objectweb/asm/optimizer/NameMapping.java | 114 + .../org/objectweb/asm/optimizer/Shrinker.java | 283 ++ .../objectweb/asm/optimizer/jdk1.2.2_017.txt.gz | Bin 0 -> 113814 bytes .../objectweb/asm/optimizer/jdk1.3.1_19.txt.gz | Bin 0 -> 128067 bytes .../asm/optimizer/shrink-annotations.properties | 71 + .../asm/optimizer/shrink-frames.properties | 80 + .../asm/optimizer/shrink-resize.properties | 55 + .../asm/optimizer/shrink-signatures.properties | 61 + .../asm/optimizer/shrink-writer.properties | 84 + .../objectweb/asm/optimizer/shrink.properties | 372 +++ .../apache/tajo/org/objectweb/asm/package.html | 105 + .../asm/signature/SignatureReader.java | 228 ++ .../asm/signature/SignatureVisitor.java | 235 ++ .../asm/signature/SignatureWriter.java | 227 ++ .../org/objectweb/asm/signature/package.html | 54 + .../objectweb/asm/tree/AbstractInsnNode.java | 248 ++ .../org/objectweb/asm/tree/AnnotationNode.java | 225 ++ .../tajo/org/objectweb/asm/tree/ClassNode.java | 345 +++ .../org/objectweb/asm/tree/FieldInsnNode.java | 108 + .../tajo/org/objectweb/asm/tree/FieldNode.java | 243 ++ .../tajo/org/objectweb/asm/tree/FrameNode.java | 210 ++ .../org/objectweb/asm/tree/IincInsnNode.java | 82 + .../org/objectweb/asm/tree/InnerClassNode.java | 101 + .../tajo/org/objectweb/asm/tree/InsnList.java | 600 ++++ .../tajo/org/objectweb/asm/tree/InsnNode.java | 87 + .../org/objectweb/asm/tree/IntInsnNode.java | 87 + .../asm/tree/InvokeDynamicInsnNode.java | 100 + .../org/objectweb/asm/tree/JumpInsnNode.java | 95 + .../tajo/org/objectweb/asm/tree/LabelNode.java | 78 + .../org/objectweb/asm/tree/LdcInsnNode.java | 78 + .../org/objectweb/asm/tree/LineNumberNode.java | 84 + .../objectweb/asm/tree/LocalVariableNode.java | 112 + .../asm/tree/LookupSwitchInsnNode.java | 117 + .../org/objectweb/asm/tree/MethodInsnNode.java | 109 + .../tajo/org/objectweb/asm/tree/MethodNode.java | 597 ++++ .../asm/tree/MultiANewArrayInsnNode.java | 83 + .../objectweb/asm/tree/TableSwitchInsnNode.java | 113 + .../objectweb/asm/tree/TryCatchBlockNode.java | 94 + .../org/objectweb/asm/tree/TypeInsnNode.java | 90 + .../org/objectweb/asm/tree/VarInsnNode.java | 93 + .../objectweb/asm/tree/analysis/Analyzer.java | 549 ++++ .../asm/tree/analysis/AnalyzerException.java | 61 + .../asm/tree/analysis/BasicInterpreter.java | 358 +++ .../objectweb/asm/tree/analysis/BasicValue.java | 111 + .../asm/tree/analysis/BasicVerifier.java | 433 +++ .../org/objectweb/asm/tree/analysis/Frame.java | 729 +++++ .../asm/tree/analysis/Interpreter.java | 226 ++ .../asm/tree/analysis/SimpleVerifier.java | 320 +++ .../objectweb/asm/tree/analysis/SmallSet.java | 134 + .../asm/tree/analysis/SourceInterpreter.java | 198 ++ .../asm/tree/analysis/SourceValue.java | 97 + .../objectweb/asm/tree/analysis/Subroutine.java | 90 + .../org/objectweb/asm/tree/analysis/Value.java | 45 + .../objectweb/asm/tree/analysis/package.html | 85 + .../tajo/org/objectweb/asm/tree/package.html | 210 ++ .../tajo/org/objectweb/asm/util/ASMifiable.java | 56 + .../tajo/org/objectweb/asm/util/ASMifier.java | 1151 ++++++++ .../asm/util/CheckAnnotationAdapter.java | 136 + .../objectweb/asm/util/CheckClassAdapter.java | 914 ++++++ .../objectweb/asm/util/CheckFieldAdapter.java | 100 + .../objectweb/asm/util/CheckMethodAdapter.java | 1397 +++++++++ .../asm/util/CheckSignatureAdapter.java | 330 +++ .../tajo/org/objectweb/asm/util/Printer.java | 500 ++++ .../org/objectweb/asm/util/Textifiable.java | 56 + .../tajo/org/objectweb/asm/util/Textifier.java | 1200 ++++++++ .../asm/util/TraceAnnotationVisitor.java | 89 + .../objectweb/asm/util/TraceClassVisitor.java | 209 ++ .../objectweb/asm/util/TraceFieldVisitor.java | 76 + .../objectweb/asm/util/TraceMethodVisitor.java | 223 ++ .../asm/util/TraceSignatureVisitor.java | 317 +++ .../tajo/org/objectweb/asm/util/package.html | 58 + .../objectweb/asm/xml/ASMContentHandler.java | 1317 +++++++++ .../tajo/org/objectweb/asm/xml/Processor.java | 1044 +++++++ .../tajo/org/objectweb/asm/xml/SAXAdapter.java | 89 + .../objectweb/asm/xml/SAXAnnotationAdapter.java | 185 ++ .../org/objectweb/asm/xml/SAXClassAdapter.java | 324 +++ .../org/objectweb/asm/xml/SAXCodeAdapter.java | 362 +++ .../org/objectweb/asm/xml/SAXFieldAdapter.java | 63 + .../tajo/org/objectweb/asm/xml/asm-xml.dtd | 367 +++ .../tajo/org/objectweb/asm/xml/package.html | 114 + tajo-yarn-pullserver/pom.xml | 17 + .../java/org/apache/tajo/storage/Tuple.java | 27 +- 256 files changed, 47500 insertions(+), 308 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index f2798b4..2b5f149 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,9 @@ Release 0.9.0 - unreleased IMPROVEMENT + TAJO-906: Runtime code generation for evaluating expression trees. + (hyunsik) + TAJO-931: Output file can be punctuated depending on the file size. (hyunsik) http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/LICENSE ---------------------------------------------------------------------- diff --git a/LICENSE b/LICENSE index 86975d5..ca54d5e 100644 --- a/LICENSE +++ b/LICENSE @@ -340,3 +340,34 @@ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +----------------------------------------------------------------------------- +Copyright (c) 2000-2011 INRIA, France Telecom +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index bf33c69..d7361bd 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,7 @@ tajo-storage tajo-yarn-pullserver tajo-dist + tajo-thirdparty/asm @@ -178,9 +179,9 @@ - org.apache.maven.plugins - maven-pmd-plugin - 2.7.1 + org.apache.rat + apache-rat-plugin + 0.7 org.apache.maven.plugins @@ -336,51 +337,6 @@ org.apache.rat apache-rat-plugin - 0.8 - - - verify - - check - - - - - false - 0 - - CHANGES - **/workers - **/querymasters - **/*.sql - **/*.hiveql - **/*.schema - **/*.tbl - **/*.js - **/*.result - **/*.json - **/*.avsc - - **/target/** - **/*.log - - .git/** - .gitignore - *.patch - .idea/** - **/*.iml - **/*.ipr - **/.project - **/.classpath - **/.settings/** - atlassian-ide-plugin.xml - .reviewboardrc - **/sphinx_rtd_theme/**/* - - **/*.rst - **/resources/* - - http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-algebra/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-algebra/pom.xml b/tajo-algebra/pom.xml index e8ff2bc..a49c212 100644 --- a/tajo-algebra/pom.xml +++ b/tajo-algebra/pom.xml @@ -44,6 +44,18 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + org.apache.maven.plugins maven-jar-plugin 2.2 @@ -79,7 +91,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/pom.xml b/tajo-catalog/pom.xml index e3ae9df..970959a 100644 --- a/tajo-catalog/pom.xml +++ b/tajo-catalog/pom.xml @@ -45,9 +45,12 @@ + org.apache.rat + apache-rat-plugin + + org.apache.maven.plugins maven-surefire-report-plugin - 2.15 maven-deploy-plugin @@ -55,12 +58,6 @@ true - - org.apache.rat - apache-rat-plugin - - - @@ -163,7 +160,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-client/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-client/pom.xml b/tajo-catalog/tajo-catalog-client/pom.xml index 959eb4c..4db1c26 100644 --- a/tajo-catalog/tajo-catalog-client/pom.xml +++ b/tajo-catalog/tajo-catalog-client/pom.xml @@ -47,6 +47,18 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + org.apache.maven.plugins maven-antrun-plugin @@ -110,7 +122,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-common/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/pom.xml b/tajo-catalog/tajo-catalog-common/pom.xml index 34f2f4b..b82495f 100644 --- a/tajo-catalog/tajo-catalog-common/pom.xml +++ b/tajo-catalog/tajo-catalog-common/pom.xml @@ -47,6 +47,18 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + org.apache.maven.plugins maven-antrun-plugin @@ -129,7 +141,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java index ae00084..a2d9796 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java @@ -481,7 +481,7 @@ public class CatalogUtil { // If all parameters are equivalent to the basis type for (TajoDataTypes.Type type : varLengthTypesOfGivenParams) { - if (type != Type.NULL_TYPE && type != basisTypeOfVarLengthType) { + if (type != Type.NULL_TYPE && !isCompatibleType(basisTypeOfVarLengthType, type)) { return false; } } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java index bed4f08..3d9bc99 100644 --- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java +++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java @@ -98,7 +98,7 @@ public class FunctionDesc implements ProtoObject, Cloneable, } @SuppressWarnings("unchecked") - public Class getFuncClass() throws InternalException { + public Class getFuncClass() { return this.funcClass; } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-drivers/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-drivers/pom.xml b/tajo-catalog/tajo-catalog-drivers/pom.xml index b57967b..2cb05ee 100644 --- a/tajo-catalog/tajo-catalog-drivers/pom.xml +++ b/tajo-catalog/tajo-catalog-drivers/pom.xml @@ -38,9 +38,17 @@ + org.apache.rat + apache-rat-plugin + + + tajo-hcatalog/** + + + + org.apache.maven.plugins maven-surefire-report-plugin - 2.15 maven-deploy-plugin @@ -68,7 +76,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/pom.xml b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/pom.xml index bac9d27..02ea16b 100644 --- a/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/pom.xml +++ b/tajo-catalog/tajo-catalog-drivers/tajo-hcatalog/pom.xml @@ -47,6 +47,23 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + + derby.log + + + + org.apache.maven.plugins maven-dependency-plugin @@ -69,7 +86,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 @@ -371,7 +387,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-catalog/tajo-catalog-server/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-catalog/tajo-catalog-server/pom.xml b/tajo-catalog/tajo-catalog-server/pom.xml index a6812fc..1e9e2c2 100644 --- a/tajo-catalog/tajo-catalog-server/pom.xml +++ b/tajo-catalog/tajo-catalog-server/pom.xml @@ -47,6 +47,24 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + + derby.log + src/main/resources/schemas/**/*.sql + + + + org.apache.maven.plugins maven-antrun-plugin @@ -106,7 +124,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 @@ -217,7 +234,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-client/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-client/pom.xml b/tajo-client/pom.xml index 0002a68..1c109f5 100644 --- a/tajo-client/pom.xml +++ b/tajo-client/pom.xml @@ -58,9 +58,20 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + org.apache.maven.plugins maven-surefire-plugin - 2.12.4 TRUE @@ -332,7 +343,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-common/pom.xml b/tajo-common/pom.xml index da2a7d0..f1a8c40 100644 --- a/tajo-common/pom.xml +++ b/tajo-common/pom.xml @@ -100,6 +100,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + org.apache.maven.plugins maven-antrun-plugin @@ -319,7 +331,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs org.apache.maven.plugins maven-surefire-report-plugin - 2.15 http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/SessionVars.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java index 5503aaa..c32fd43 100644 --- a/tajo-common/src/main/java/org/apache/tajo/SessionVars.java +++ b/tajo-common/src/main/java/org/apache/tajo/SessionVars.java @@ -108,8 +108,8 @@ public enum SessionVars implements ConfigKey { HASH_GROUPBY_SIZE_LIMIT(ConfVars.$EXECUTOR_GROUPBY_INMEMORY_HASH_THRESHOLD, "limited size for hash groupby (mb)", DEFAULT), MAX_OUTPUT_FILE_SIZE(ConfVars.$MAX_OUTPUT_FILE_SIZE, "Maximum per-output file size (mb). 0 means infinite.", DEFAULT), - NULL_CHAR(ConfVars.$CSVFILE_NULL, "null char of text file output", DEFAULT), + CODEGEN(ConfVars.$CODEGEN, "Runtime code generation enabled (experiment)", DEFAULT), // Behavior Control --------------------------------------------------------- ARITHABORT(ConfVars.$BEHAVIOR_ARITHMETIC_ABORT, http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java index 77c2363..178d80e 100644 --- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java +++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java @@ -324,7 +324,7 @@ public class TajoConf extends Configuration { $EXECUTOR_GROUPBY_INMEMORY_HASH_THRESHOLD("tajo.executor.groupby.in-memory-hash-threshold-bytes", (long)256 * 1048576), $MAX_OUTPUT_FILE_SIZE("tajo.query.max-outfile-size-mb", 0), // zero means infinite - + $CODEGEN("tajo.executor.codegen.enabled", false), // Runtime code generation // Client ----------------------------------------------------------------- $CLIENT_SESSION_EXPIRY_TIME("tajo.client.session.expiry-time-sec", 3600), // default time is one hour. http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java index e6c4d94..750930f 100644 --- a/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java +++ b/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java @@ -149,9 +149,8 @@ public class CharDatum extends Datum { public int compareTo(Datum datum) { switch (datum.type()) { case CHAR: - CharDatum other = (CharDatum) datum; - return UnsignedBytes.lexicographicalComparator().compare(bytes, other.bytes); - + case TEXT: + return UnsignedBytes.lexicographicalComparator().compare(bytes, datum.asByteArray()); case NULL_TYPE: return -1; http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java index 29d7a04..442db71 100644 --- a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java +++ b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java @@ -53,6 +53,10 @@ public abstract class Datum implements Comparable, GsonObject { return false; } + public boolean isNotNull() { + return true; + } + public boolean asBool() { throw new InvalidCastException(type, Type.BOOLEAN); } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java index 7d6ef18..17cfc7a 100644 --- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java +++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java @@ -271,17 +271,15 @@ public class DatumFactory { } public static DateDatum createDate(String dateStr) { - TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr); - return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth)); + return new DateDatum(DateTimeUtil.toJulianDate(dateStr)); } public static TimeDatum createTime(long instance) { return new TimeDatum(instance); } - public static TimeDatum createTime(String dateStr) { - TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr); - return new TimeDatum(DateTimeUtil.toTime(tm)); + public static TimeDatum createTime(String timeStr) { + return new TimeDatum(DateTimeUtil.toJulianTime(timeStr)); } public static TimestampDatum createTimestmpDatumWithJavaMillis(long millis) { @@ -300,6 +298,11 @@ public class DatumFactory { return new IntervalDatum(intervalStr); } + @SuppressWarnings("unused") + public static IntervalDatum createInterval(long interval) { + return new IntervalDatum(interval); + } + public static DateDatum createDate(Datum datum) { switch (datum.type()) { case INT4: @@ -333,11 +336,7 @@ public class DatumFactory { public static TimestampDatum createTimestamp(Datum datum) { switch (datum.type()) { case TEXT: - long timestamp = DateTimeUtil.toJulianTimestamp(datum.asChars()); - TimeMeta tm = new TimeMeta(); - DateTimeUtil.toJulianTimeMeta(timestamp, tm); - DateTimeUtil.toUTCTimezone(tm); - return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); + return parseTimestamp(datum.asChars()); case TIMESTAMP: return (TimestampDatum) datum; default: @@ -345,6 +344,15 @@ public class DatumFactory { } } + @SuppressWarnings("unused") + public static TimestampDatum createTimestamp(long julianTimestamp) { + return new TimestampDatum(julianTimestamp); + } + + public static TimestampDatum parseTimestamp(String str) { + return new TimestampDatum(DateTimeUtil.toJulianTimestampWithTZ(str)); + } + public static BlobDatum createBlob(byte[] val) { return new BlobDatum(val); } @@ -357,6 +365,10 @@ public class DatumFactory { return new BlobDatum(val.getBytes()); } + public static Inet4Datum createInet4(int encoded) { + return new Inet4Datum(encoded); + } + public static Inet4Datum createInet4(byte[] val) { return new Inet4Datum(val); } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/datum/Inet4Datum.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Inet4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Inet4Datum.java index 08b76f0..1de81cd 100644 --- a/tajo-common/src/main/java/org/apache/tajo/datum/Inet4Datum.java +++ b/tajo-common/src/main/java/org/apache/tajo/datum/Inet4Datum.java @@ -29,6 +29,11 @@ public class Inet4Datum extends Datum { private static final int size = 4; @Expose private final int address; + Inet4Datum(int encoded) { + super(Type.INET4); + this.address = encoded; + } + public Inet4Datum(String addr) { super(Type.INET4); String [] elems = addr.split("\\."); http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java index 532e7cd..0007b52 100644 --- a/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java +++ b/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java @@ -52,6 +52,11 @@ public class NullDatum extends Datum { } @Override + public boolean isNotNull() { + return false; + } + + @Override public boolean asBool() { throw new InvalidCastException(Type.NULL_TYPE, Type.BOOLEAN); } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/util/CommonTestingUtil.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/util/CommonTestingUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/CommonTestingUtil.java index 8dd8bfe..e62cb12 100644 --- a/tajo-common/src/main/java/org/apache/tajo/util/CommonTestingUtil.java +++ b/tajo-common/src/main/java/org/apache/tajo/util/CommonTestingUtil.java @@ -21,12 +21,34 @@ package org.apache.tajo.util; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.tajo.ConfigKey; +import org.apache.tajo.OverridableConf; +import org.apache.tajo.SessionVars; +import org.apache.tajo.conf.TajoConf; import java.io.IOException; import java.util.UUID; public class CommonTestingUtil { - public static final String TAJO_TEST = "tajo.test"; + public static final String TAJO_TEST_KEY = "tajo.test.enabled"; + public static final String TAJO_TEST_TRUE = "true"; + private static OverridableConf userSessionVars; + + static { + System.setProperty(CommonTestingUtil.TAJO_TEST_KEY, CommonTestingUtil.TAJO_TEST_TRUE); + + userSessionVars = new OverridableConf(new TajoConf(), ConfigKey.ConfigType.SESSION); + for (SessionVars var : SessionVars.values()) { + String value = System.getProperty(var.keyname()); + if (value != null) { + userSessionVars.put(var, value); + } + } + } + + public static OverridableConf getSessionVarsForTest() { + return userSessionVars; + } /** * http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/util/Pair.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/util/Pair.java b/tajo-common/src/main/java/org/apache/tajo/util/Pair.java index 7b5f8ad..e8852df 100644 --- a/tajo-common/src/main/java/org/apache/tajo/util/Pair.java +++ b/tajo-common/src/main/java/org/apache/tajo/util/Pair.java @@ -18,6 +18,8 @@ package org.apache.tajo.util; +import com.google.common.base.Objects; + public class Pair { private T1 first; private T2 second; @@ -49,7 +51,17 @@ public class Pair { } @Override + public boolean equals(Object obj) { + if (obj instanceof Pair) { + Pair other = (Pair) obj; + return first.equals(other.first) && second.equals(other.second); + } else { + return false; + } + } + + @Override public int hashCode() { - return toString().hashCode(); + return Objects.hashCode(first, second); } } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java index 327b423..9198f5b 100644 --- a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java +++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java @@ -663,6 +663,41 @@ public class DateTimeUtil { return toJulianTimestamp(tm); } + + /** + * Parse datetime string to julian time. + * The result is the local time basis. + * @param timestampStr + * @return + */ + public static long toJulianTimestampWithTZ(String timestampStr) { + long timestamp = DateTimeUtil.toJulianTimestamp(timestampStr); + TimeMeta tm = new TimeMeta(); + DateTimeUtil.toJulianTimeMeta(timestamp, tm); + DateTimeUtil.toUTCTimezone(tm); + return DateTimeUtil.toJulianTimestamp(tm); + } + + /** + * Parse datetime string to julian date. + * @param dateStr + * @return + */ + public static int toJulianDate(String dateStr) { + TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr); + return DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth); + } + + /** + * Parse datetime string to julian time. + * @param timeStr + * @return + */ + public static long toJulianTime(String timeStr) { + TimeMeta tm = DateTimeUtil.decodeDateTime(timeStr); + return DateTimeUtil.toTime(tm); + } + public static TimeMeta decodeDateTime(String str) { return decodeDateTime(str, MAXDATEFIELDS); } http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/pom.xml ---------------------------------------------------------------------- diff --git a/tajo-core/pom.xml b/tajo-core/pom.xml index 364c428..d33b598 100644 --- a/tajo-core/pom.xml +++ b/tajo-core/pom.xml @@ -60,9 +60,32 @@ + org.apache.rat + apache-rat-plugin + + + verify + + check + + + + + + derby.log + benchmark/** + src/test/tpch/** + src/test/resources/dataset/** + src/test/resources/queries/** + src/test/resources/results/** + src/test/resources/results/** + src/main/resources/webapps/static/js/* + + + + org.apache.maven.plugins maven-surefire-plugin - 2.12.4 TRUE @@ -192,11 +215,6 @@ - - org.apache.maven.plugins - maven-pmd-plugin - 2.7.1 - @@ -242,6 +260,10 @@ org.apache.tajo tajo-rpc + + org.apache.tajo + tajo-thirdparty-asm + org.apache.hadoop http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java new file mode 100644 index 0000000..16bd396 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenEmitter.java @@ -0,0 +1,210 @@ +/* + * 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.tajo.engine.codegen; + +import com.google.common.base.Preconditions; +import org.apache.tajo.engine.eval.BinaryEval; +import org.apache.tajo.engine.eval.CaseWhenEval; +import org.apache.tajo.engine.eval.EvalNode; +import org.apache.tajo.engine.eval.EvalType; +import org.apache.tajo.org.objectweb.asm.Label; +import org.apache.tajo.org.objectweb.asm.Opcodes; + +import java.util.List; +import java.util.Stack; + +class CaseWhenEmitter implements EvalCodeEmitter { + public static final CaseWhenEmitter instance; + + static { + instance = new CaseWhenEmitter(); + } + + public static CaseWhenEmitter getInstance() { + return instance; + } + + @Override + public void emit(EvalCodeGenerator codeGen, EvalCodeGenContext context, CaseWhenEval caseWhen, + Stack stack) { + // TYPE 1: CASE WHEN x THEN c1 WHEN y THEN c2 WHEN c3 ELSE ... END; + EvalNode commonTerm = extractCommonTerm(caseWhen.getIfThenEvals()); + + if (commonTerm != null) { + int casesNum = caseWhen.getIfThenEvals().size(); + List ifThenList = caseWhen.getIfThenEvals(); + TajoGeneratorAdapter.SwitchCase[] cases = new TajoGeneratorAdapter.SwitchCase[casesNum]; + + for (int i = 0; i < caseWhen.getIfThenEvals().size(); i++) { + int key = getSwitchIndex(ifThenList.get(i).getCondition()); + EvalNode result = ifThenList.get(i).getResult(); + cases[i] = new TajoGeneratorAdapter.SwitchCase(key, result); + } + CaseWhenSwitchGenerator gen = new CaseWhenSwitchGenerator(codeGen, context, stack, cases, caseWhen.getElse()); + + stack.push(caseWhen); + + codeGen.visit(context, commonTerm, stack); + + Label ifNull = context.newLabel(); + Label endIf = context.newLabel(); + + context.emitNullityCheck(ifNull); + context.generatorAdapter.tableSwitch(gen.keys(), gen); + context.gotoLabel(endIf); + + codeGen.emitLabel(context, ifNull); + context.pop(commonTerm.getValueType()); + codeGen.visit(context, caseWhen.getElse(), stack); + + codeGen.emitLabel(context, endIf); + + stack.pop(); + } else { // TYPE 2: CASE WHEN x = c1 THEN r1 WHEN y = c2 THEN r2 ELSE ... END + int casesNum = caseWhen.getIfThenEvals().size(); + Label [] labels = new Label[casesNum - 1]; + + for (int i = 0; i < labels.length; i++) { + labels[i] = context.newLabel(); + } + + Label defaultLabel = context.newLabel(); + Label ifNull = context.newLabel(); + Label afterAll = context.newLabel(); + + // The following will generate code as follows. defaultLabel points to the last else clause. + // + // if (...) { + // ..... + // } else if (...) { + // .... + // } else if (...) { + // } ..... { + // } else { <- default label + // ... + // } + + stack.push(caseWhen); + for (int i = 0; i < casesNum; i++) { + CaseWhenEval.IfThenEval ifThenEval = caseWhen.getIfThenEvals().get(i); + + stack.push(caseWhen); + codeGen.visit(context, ifThenEval.getCondition(), stack); + int NULL_FLAG = context.istore(); + int CHILD = context.store(ifThenEval.getCondition().getValueType()); + + context.iload(NULL_FLAG); + context.emitNullityCheck(ifNull); + + context.pushBooleanOfThreeValuedLogic(true); + context.load(ifThenEval.getCondition().getValueType(), CHILD); + context.methodvisitor.visitJumpInsn(Opcodes.IF_ICMPNE, (casesNum - 1) < i ? labels[i] : defaultLabel); // false + + codeGen.visit(context, ifThenEval.getResult(), stack); + context.gotoLabel(afterAll); + stack.pop(); + + if (i < casesNum - 1) { + codeGen.emitLabel(context, labels[i]); // else if + } + } + stack.pop(); + + codeGen.emitLabel(context, defaultLabel); + if (caseWhen.hasElse()) { + stack.push(caseWhen); + codeGen.visit(context, caseWhen.getElse(), stack); + stack.pop(); + context.gotoLabel(afterAll); + } else { + context.gotoLabel(ifNull); + } + + codeGen.emitLabel(context, ifNull); + context.pushDummyValue(caseWhen.getValueType()); + context.pushNullFlag(false); + + codeGen.emitLabel(context, afterAll); + } + } + + private EvalNode extractCommonTerm(List ifThenEvals) { + EvalNode commonTerm = null; + + for (int i = 0; i < ifThenEvals.size(); i++) { + EvalNode predicate = ifThenEvals.get(i).getCondition(); + if (!checkIfSimplePredicate(predicate)) { + return null; + } + + BinaryEval bin = (BinaryEval) predicate; + + EvalNode baseTerm; + if (bin.getLeftExpr().getType() == EvalType.CONST) { + baseTerm = bin.getRightExpr(); + } else { + baseTerm = bin.getLeftExpr(); + } + + if (commonTerm == null) { + commonTerm = baseTerm; + } else { + if (!baseTerm.equals(commonTerm)) { + return null; + } + } + } + + return commonTerm; + } + + /** + * Simple predicate means one term is constant and comparator is equal. + * + * @param predicate Predicate to be checked + * @return True if the predicate is a simple form. + */ + private boolean checkIfSimplePredicate(EvalNode predicate) { + if (predicate.getType() == EvalType.EQUAL) { + BinaryEval binaryEval = (BinaryEval) predicate; + EvalNode lhs = binaryEval.getLeftExpr(); + EvalNode rhs = binaryEval.getRightExpr(); + + boolean simple = false; + simple |= rhs.getType() == EvalType.CONST && TajoGeneratorAdapter.isJVMInternalInt(rhs.getValueType()); + simple |= lhs.getType() == EvalType.CONST && TajoGeneratorAdapter.isJVMInternalInt(lhs.getValueType()); + return simple; + } else { + return false; + } + } + + private int getSwitchIndex(EvalNode predicate) { + Preconditions.checkArgument(checkIfSimplePredicate(predicate), + "This expression cannot be used for switch table: " + predicate); + + BinaryEval bin = (BinaryEval) predicate; + + if (bin.getLeftExpr().getType() == EvalType.CONST) { + return bin.getLeftExpr().eval(null, null).asInt4(); + } else { + return bin.getRightExpr().eval(null, null).asInt4(); + } + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java new file mode 100644 index 0000000..6f928ac --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CaseWhenSwitchGenerator.java @@ -0,0 +1,92 @@ +/* + * 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.tajo.engine.codegen; + +import com.google.common.collect.Maps; +import org.apache.tajo.engine.eval.EvalNode; +import org.apache.tajo.org.objectweb.asm.Label; + +import java.util.NavigableMap; +import java.util.Stack; + +class CaseWhenSwitchGenerator implements TajoGeneratorAdapter.SwitchCaseGenerator { + final private EvalCodeGenerator generator; + final private EvalCodeGenContext context; + final private Stack stack; + + final NavigableMap casesMap; + final EvalNode defaultEval; + + public CaseWhenSwitchGenerator(EvalCodeGenerator generator, EvalCodeGenContext context, Stack stack, + TajoGeneratorAdapter.SwitchCase[] cases, EvalNode defaultEval) { + this.generator = generator; + this.context = context; + this.stack = stack; + this.casesMap = Maps.newTreeMap(); + for (TajoGeneratorAdapter.SwitchCase switchCase : cases) { + this.casesMap.put(switchCase.key(), switchCase); + } + this.defaultEval = defaultEval; + } + + @Override + public int size() { + return casesMap.size(); + } + + @Override + public int min() { + return casesMap.firstEntry().getKey(); + } + + @Override + public int max() { + return casesMap.lastEntry().getKey(); + } + + @Override + public int key(int index) { + return casesMap.get(index).key(); + } + + @Override + public void generateCase(int key, Label end) { + generator.visit(context, casesMap.get(key).result(), stack); + context.gotoLabel(end); + } + + public int [] keys() { + int [] keys = new int[casesMap.size()]; + + int idx = 0; + for (int key : casesMap.keySet()) { + keys[idx++] = key; + } + return keys; + } + + public void generateDefault() { + if (defaultEval != null) { + generator.visit(context, defaultEval, stack); + } else { + context.pushNullOfThreeValuedLogic(); + context.pushNullFlag(false); + } + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CodeGenUtils.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CodeGenUtils.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CodeGenUtils.java new file mode 100644 index 0000000..84a93fc --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CodeGenUtils.java @@ -0,0 +1,41 @@ +/* + * 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.tajo.engine.codegen; + +import org.apache.tajo.org.objectweb.asm.ClassReader; +import org.apache.tajo.org.objectweb.asm.util.ASMifier; +import org.apache.tajo.org.objectweb.asm.util.TraceClassVisitor; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public class CodeGenUtils { + private static final int FLAGS = ClassReader.SKIP_DEBUG; + + public static String disassemble(byte [] bytesCode) { + StringWriter strWriter = new StringWriter(); + PrintWriter writer = new PrintWriter(strWriter); + + ClassReader cr; + cr = new ClassReader(bytesCode); + cr.accept(new TraceClassVisitor(null, new ASMifier(), writer), FLAGS); + + return strWriter.toString(); + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java new file mode 100644 index 0000000..27054de --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/CompilationError.java @@ -0,0 +1,31 @@ +/** + * 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.tajo.engine.codegen; + +import org.apache.tajo.engine.eval.EvalNode; + +public class CompilationError extends RuntimeException { + public CompilationError(String message) { + super(message); + } + + public CompilationError(EvalNode evalNode, Throwable t, byte [] clazz) { + super("Compilation Error: " + evalNode.toString() + "\n\nBYTES CODE DUMP:\n" + CodeGenUtils.disassemble(clazz), t); + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java new file mode 100644 index 0000000..d94c907 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeEmitter.java @@ -0,0 +1,27 @@ +/* + * 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.tajo.engine.codegen; + +import org.apache.tajo.engine.eval.EvalNode; + +import java.util.Stack; + +public interface EvalCodeEmitter { + void emit(EvalCodeGenerator gen, EvalCodeGenContext context, T caseWhen, Stack stack); +} http://git-wip-us.apache.org/repos/asf/tajo/blob/7603a3d4/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java new file mode 100644 index 0000000..03c0402 --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/engine/codegen/EvalCodeGenContext.java @@ -0,0 +1,223 @@ +/* + * 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.tajo.engine.codegen; + +import com.google.common.collect.Maps; +import org.apache.tajo.catalog.Schema; +import org.apache.tajo.common.TajoDataTypes; +import org.apache.tajo.datum.Datum; +import org.apache.tajo.datum.IntervalDatum; +import org.apache.tajo.engine.eval.*; +import org.apache.tajo.org.objectweb.asm.ClassWriter; +import org.apache.tajo.org.objectweb.asm.MethodVisitor; +import org.apache.tajo.org.objectweb.asm.Opcodes; +import org.apache.tajo.org.objectweb.asm.commons.GeneratorAdapter; +import org.apache.tajo.storage.Tuple; + +import java.util.Map; +import java.util.Stack; + +public class EvalCodeGenContext extends TajoGeneratorAdapter { + final String owner; + final Schema schema; + final ClassWriter classWriter; + final EvalNode evalNode; + final Map symbols; + int seqId = 0; + + public EvalCodeGenContext(String className, Schema schema, ClassWriter classWriter, EvalNode evalNode) { + this.owner = className; + this.classWriter = classWriter; + this.schema = schema; + this.evalNode = evalNode; + this.symbols = Maps.newHashMap(); + + emitClassDefinition(); + emitMemberFields(); + classWriter.visitEnd(); + emitConstructor(); + + String methodName = "eval"; + String methodDesc = TajoGeneratorAdapter.getMethodDescription(Datum.class, new Class[]{Schema.class, Tuple.class}); + MethodVisitor evalMethod = classWriter.visitMethod(Opcodes.ACC_PUBLIC, methodName, methodDesc, null, null); + evalMethod.visitCode(); + this.methodvisitor = evalMethod; + generatorAdapter = new GeneratorAdapter(this.methodvisitor, access, methodDesc, methodDesc); + } + + public void emitClassDefinition() { + classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, this.owner, null, + TajoGeneratorAdapter.getInternalName(EvalNode.class), null); + } + + public void emitMemberFields() { + classWriter.visitField(Opcodes.ACC_PRIVATE, "schema", + "L" + TajoGeneratorAdapter.getInternalName(Schema.class) + ";", null, null); + + VariablesPreBuilder builder = new VariablesPreBuilder(); + builder.visit(this, evalNode, new Stack()); + } + + public static void emitCreateSchema(TajoGeneratorAdapter adapter, MethodVisitor mv, Schema schema) { + mv.visitLdcInsn(schema.toJson()); + adapter.invokeStatic(EvalCodeGenerator.class, "createSchema", Schema.class, new Class[] {String.class}); + } + + public static void emitCreateEval(TajoGeneratorAdapter adapter, MethodVisitor mv, EvalNode evalNode) { + mv.visitLdcInsn(evalNode.toJson()); + adapter.invokeStatic(EvalCodeGenerator.class, "createEval", EvalNode.class, new Class[] {String.class}); + } + + public static void emitConstEval(TajoGeneratorAdapter adapter, MethodVisitor mv, ConstEval evalNode) { + mv.visitLdcInsn(evalNode.toJson()); + adapter.invokeStatic(EvalCodeGenerator.class, "createConstEval", ConstEval.class, new Class[] {String.class}); + } + + public static void emitRowConstantEval(TajoGeneratorAdapter adapter, MethodVisitor mv, RowConstantEval evalNode) { + mv.visitLdcInsn(evalNode.toJson()); + adapter.invokeStatic(EvalCodeGenerator.class, "createRowConstantEval", RowConstantEval.class, + new Class[] {String.class}); + } + + public void emitConstructor() { + // constructor method + MethodVisitor initMethod = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null); + initMethod.visitCode(); + initMethod.visitVarInsn(Opcodes.ALOAD, 0); + initMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, TajoGeneratorAdapter.getInternalName(EvalNode.class), "", + "()V"); + + TajoGeneratorAdapter consAdapter = new TajoGeneratorAdapter(Opcodes.ACC_PUBLIC, initMethod, "", "()V"); + + // == this.schema = schema; + if (schema != null) { + consAdapter.aload(0); + emitCreateSchema(consAdapter, initMethod, schema); + initMethod.visitFieldInsn(Opcodes.PUTFIELD, this.owner, "schema", getDescription(Schema.class)); + } + + for (Map.Entry entry : symbols.entrySet()) { + if (entry.getKey().getType() == EvalType.CONST) { + ConstEval constEval = (ConstEval) entry.getKey(); + + if (constEval.getValueType().getType() == TajoDataTypes.Type.INTERVAL) { + IntervalDatum datum = (IntervalDatum) constEval.getValue(); + + final String internalName = TajoGeneratorAdapter.getInternalName(IntervalDatum.class); + + initMethod.visitTypeInsn(Opcodes.NEW, internalName); + consAdapter.dup(); + initMethod.visitLdcInsn(datum.getMonths()); + initMethod.visitLdcInsn(datum.getMilliSeconds()); + initMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, internalName, "", "(IJ)V"); + int INTERVAL_DATUM = consAdapter.astore(); + + consAdapter.aload(0); + consAdapter.aload(INTERVAL_DATUM); + initMethod.visitFieldInsn(Opcodes.PUTFIELD, this.owner, entry.getValue(), + "L" + TajoGeneratorAdapter.getInternalName(IntervalDatum.class) + ";"); + } + + } else if (entry.getKey().getType() == EvalType.IN) { + InEval inEval = (InEval) entry.getKey(); + + final String internalName = getInternalName(InEval.class); + initMethod.visitTypeInsn(Opcodes.NEW, internalName); + consAdapter.dup(); + emitCreateEval(consAdapter, initMethod, inEval.getLeftExpr()); + emitRowConstantEval(consAdapter, initMethod, (RowConstantEval) inEval.getRightExpr()); + consAdapter.push(inEval.isNot()); + consAdapter.invokeSpecial(InEval.class, "", void.class, + new Class [] {EvalNode.class, RowConstantEval.class, boolean.class}); + int IN_PREDICATE_EVAL = consAdapter.astore(); + + consAdapter.aload(0); + consAdapter.aload(IN_PREDICATE_EVAL); + initMethod.visitFieldInsn(Opcodes.PUTFIELD, this.owner, entry.getValue(), getDescription(InEval.class)); + + } else if (EvalType.isStringPatternMatchOperator(entry.getKey().getType())) { + PatternMatchPredicateEval patternPredicate = (PatternMatchPredicateEval) entry.getKey(); + + Class clazz = EvalCodeGenerator.getStringPatternEvalClass(entry.getKey().getType()); + final String internalName = TajoGeneratorAdapter.getInternalName(clazz); + + initMethod.visitTypeInsn(Opcodes.NEW, internalName); + consAdapter.dup(); + consAdapter.push(patternPredicate.isNot()); + emitCreateEval(consAdapter, initMethod, patternPredicate.getLeftExpr()); + emitConstEval(consAdapter, initMethod, (ConstEval) patternPredicate.getRightExpr()); + consAdapter.push(patternPredicate.isCaseInsensitive()); + consAdapter.invokeSpecial(clazz, "", void.class, + new Class [] {boolean.class, EvalNode.class, ConstEval.class, boolean.class}); + + int PatternEval = consAdapter.astore(); + + consAdapter.aload(0); + consAdapter.aload(PatternEval); + initMethod.visitFieldInsn(Opcodes.PUTFIELD, this.owner, entry.getValue(), getDescription(clazz)); + + } else if (entry.getKey().getType() == EvalType.FUNCTION) { + GeneralFunctionEval function = (GeneralFunctionEval) entry.getKey(); + final String internalName = TajoGeneratorAdapter.getInternalName(function.getFuncDesc().getFuncClass()); + + // new and initialization of function + initMethod.visitTypeInsn(Opcodes.NEW, internalName); + consAdapter.dup(); + initMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, internalName, "", "()V"); + int FUNCTION = consAdapter.astore(); + + // commParam + int paramNum = function.getArgs().length; + initMethod.visitLdcInsn(paramNum); + consAdapter.newArray(FunctionEval.ParamType.class); + final int PARAM_TYPE_ARRAY = consAdapter.astore(); + FunctionEval.ParamType[] paramTypes = EvalCodeGenerator.getParamTypes(function.getArgs()); + for (int paramIdx = 0; paramIdx < paramTypes.length; paramIdx++) { + consAdapter.aload(PARAM_TYPE_ARRAY); + consAdapter.methodvisitor.visitLdcInsn(paramIdx); + consAdapter.methodvisitor.visitFieldInsn(Opcodes.GETSTATIC, TajoGeneratorAdapter.getInternalName(FunctionEval.ParamType.class), + paramTypes[paramIdx].name(), TajoGeneratorAdapter.getDescription(FunctionEval.ParamType.class)); + consAdapter.methodvisitor.visitInsn(Opcodes.AASTORE); + } + + initMethod.visitVarInsn(Opcodes.ALOAD, FUNCTION); + consAdapter.aload(PARAM_TYPE_ARRAY); + consAdapter.invokeVirtual(function.getFuncDesc().getFuncClass(), "init", void.class, new Class[] {FunctionEval.ParamType[].class}); + + initMethod.visitVarInsn(Opcodes.ALOAD, 0); + initMethod.visitVarInsn(Opcodes.ALOAD, FUNCTION); + initMethod.visitFieldInsn(Opcodes.PUTFIELD, this.owner, entry.getValue(), + "L" + TajoGeneratorAdapter.getInternalName(function.getFuncDesc().getFuncClass()) + ";"); + + } + } + + initMethod.visitInsn(Opcodes.RETURN); + initMethod.visitMaxs(1, 1); + initMethod.visitEnd(); + } + + public void emitReturn() { + convertToDatum(evalNode.getValueType(), true); + methodvisitor.visitInsn(Opcodes.ARETURN); + methodvisitor.visitMaxs(0, 0); + methodvisitor.visitEnd(); + classWriter.visitEnd(); + } +}