Author: cws
Date: Fri Dec  2 08:14:10 2011
New Revision: 1209384

URL: http://svn.apache.org/viewvc?rev=1209384&view=rev
Log:
HIVE-2523. Add a new builtins subproject (John Sichi via cws)

Added:
    hive/trunk/builtins/
    hive/trunk/builtins/build-plugin.xml
    hive/trunk/builtins/build.xml
    hive/trunk/builtins/ivy.xml
    hive/trunk/builtins/src/
    hive/trunk/builtins/src/org/
    hive/trunk/builtins/src/org/apache/
    hive/trunk/builtins/src/org/apache/hive/
    hive/trunk/builtins/src/org/apache/hive/builtins/
    hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java
    hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java
    hive/trunk/builtins/test/
    hive/trunk/builtins/test/cleanup.sql
    hive/trunk/builtins/test/iris.txt
    hive/trunk/builtins/test/onerow.txt
    hive/trunk/builtins/test/setup.sql
Modified:
    hive/trunk/bin/hive
    hive/trunk/build.xml
    hive/trunk/eclipse-templates/.classpath
    hive/trunk/pdk/scripts/build-plugin.xml
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
    hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out

Modified: hive/trunk/bin/hive
URL: 
http://svn.apache.org/viewvc/hive/trunk/bin/hive?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/bin/hive (original)
+++ hive/trunk/bin/hive Fri Dec  2 08:14:10 2011
@@ -74,6 +74,11 @@ if [ ! -f ${HIVE_LIB}/hive-exec-*.jar ];
   exit 1;
 fi
 
+if [ ! -f ${HIVE_LIB}/hive-builtins-*.jar ]; then
+  echo "Missing Hive Builtins Jar: ${HIVE_LIB}/hive-builtins-*.jar"
+  exit 1;
+fi
+
 if [ ! -f ${HIVE_LIB}/hive-metastore-*.jar ]; then
   echo "Missing Hive MetaStore Jar"
   exit 2;

Modified: hive/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/hive/trunk/build.xml?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/build.xml (original)
+++ hive/trunk/build.xml Fri Dec  2 08:14:10 2011
@@ -139,7 +139,7 @@
       <subant target="@{target}">
         <property name="build.dir.hive" location="${build.dir.hive}"/>
         <property name="is-offline" value="${is-offline}"/>
-        <filelist dir="." 
files="ant/build.xml,shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,ant/build.xml,pdk/build.xml"/>
+        <filelist dir="." 
files="ant/build.xml,shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,ant/build.xml,pdk/build.xml,builtins/build.xml"/>
       </subant>
     </sequential>
   </macrodef>
@@ -150,7 +150,7 @@
       <subant target="@{target}">
         <property name="build.dir.hive" location="${build.dir.hive}"/>
         <property name="is-offline" value="${is-offline}"/>
-        <filelist dir="." 
files="shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,pdk/build.xml"/>
+        <filelist dir="." 
files="shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,pdk/build.xml,builtins/build.xml"/>
       </subant>
     </sequential>
   </macrodef>
@@ -519,6 +519,13 @@
     <symlink overwrite="true" link="${target.lib.dir}/libthrift.jar" 
resource="libthrift-${libthrift.version}.jar"/>
     <symlink overwrite="true" link="${target.lib.dir}/libfb303.jar" 
resource="libfb303-${libfb303.version}.jar"/>
     <symlink overwrite="true" link="${target.lib.dir}/hive_contrib.jar" 
resource="hive-contrib-${version}.jar"/>
+    <!-- special case because builtins compilation depends on packaging
+         up everything else first -->
+    <ant antfile="${hive.root}/builtins/build.xml" target="package"
+         inheritAll="false" />
+    <copy todir="${target.lib.dir}" preservelastmodified="true" flatten="true">
+      <fileset file="${build.dir.hive}/builtins/hive-builtins-${version}.jar"/>
+    </copy>
   </target>
 
 
@@ -665,6 +672,7 @@
       <packageset dir="${build.dir.hive}/ql/gen/antlr/gen-java"/>
       <packageset dir="shims/src/common/java"/>
       <packageset dir="pdk/src/java"/>
+      <packageset dir="builtins/src"/>
 
       <link href="${javadoc.link.java}"/>
 
@@ -902,6 +910,8 @@
           todir="${mvn.jar.dir}" />
     <copy file="${build.dir.hive}/pdk/hive-pdk-${version}.jar"
           todir="${mvn.jar.dir}" />
+    <copy file="${build.dir.hive}/pdk/hive-builtins-${version}.jar"
+          todir="${mvn.jar.dir}" />
 
     <!-- copy over maven pom files created using the make-pom target and 
rename to maven convention -->
     <copy file="${build.dir.hive}/anttasks/pom.xml"
@@ -930,6 +940,8 @@
           tofile="${mvn.pom.dir}/hive-shims-${version}.pom" />
     <copy file="${build.dir.hive}/pdk/pom.xml"
           tofile="${mvn.pom.dir}/hive-pdk-${version}.pom" />
+    <copy file="${build.dir.hive}/builtins/pom.xml"
+          tofile="${mvn.pom.dir}/hive-builtins-${version}.pom" />
 
     <!-- copy over licence -->
     <copy file="${hive.root}/LICENSE" todir="${mvn.license.dir}" />
@@ -1019,6 +1031,9 @@
       <param name="hive.project" value="pdk" />
     </antcall>
     <antcall target="maven-publish-artifact">
+      <param name="hive.project" value="builtins" />
+    </antcall>
+    <antcall target="maven-publish-artifact">
       <param name="hive.project" value="jdbc" />
     </antcall>
     <antcall target="maven-publish-artifact">
@@ -1138,6 +1153,14 @@
         output.file="${mvn.pom.dir}/hive-pdk-${version}.pom.asc"
         gpg.passphrase="${gpg.passphrase}"/>
     <sign-artifact
+        input.file="${mvn.jar.dir}/hive-builtins-${version}.jar"
+        output.file="${mvn.jar.dir}/hive-builtins-${version}.jar.asc"
+        gpg.passphrase="${gpg.passphrase}"/>
+    <sign-artifact
+        input.file="${mvn.pom.dir}/hive-builtins-${version}.pom"
+        output.file="${mvn.pom.dir}/hive-builtins-${version}.pom.asc"
+        gpg.passphrase="${gpg.passphrase}"/>
+    <sign-artifact
         input.file="${mvn.jar.dir}/hive-serde-${version}.jar"
         output.file="${mvn.jar.dir}/hive-serde-${version}.jar.asc"
         gpg.passphrase="${gpg.passphrase}"/>

Added: hive/trunk/builtins/build-plugin.xml
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/build-plugin.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/build-plugin.xml (added)
+++ hive/trunk/builtins/build-plugin.xml Fri Dec  2 08:14:10 2011
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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 name="builtins-plugin" default="jar">
+  <dirname property="builtins.dir" file="${ant.file.builtins}"/>
+  <property name="hive.root" location="${builtins.dir}/.."/>
+  <property file="${hive.root}/build.properties"/>
+  <property name="plugin.libname" value="hive-builtins"/>
+  <property name="plugin.title" value="Hive Builtin Function Library"/>
+  <property name="plugin.version" value="${version}"/>
+  <property name="plugin.vendor" value="Apache Software Foundation"/>
+  <property name="function.sql.prefix" value=""/>
+  <property name="build.dir" location="${hive.root}/build/builtins"/>
+  <property name="install.dir" location="${hive.root}/build/dist"/>
+  <import file="${hive.root}/pdk/scripts/build-plugin.xml"/>
+</project>

Added: hive/trunk/builtins/build.xml
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/build.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/build.xml (added)
+++ hive/trunk/builtins/build.xml Fri Dec  2 08:14:10 2011
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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 name="builtins" default="jar">
+
+  <property name="src.dir"  location="${basedir}/src"/>
+  <import file="../build-common.xml"/>
+
+  <target name="compile" depends="init, setup">
+    <echo message="Project: ${ant.project.name}"/>
+    <!-- defer compilation until package phase -->
+  </target>
+
+  <target name="jar" depends="init">
+    <echo message="Project: ${ant.project.name}"/>
+    <!-- defer compilation until package phase -->
+  </target>
+
+  <target name="package">
+    <echo message="Project: ${ant.project.name}"/>
+    <ant antfile="build-plugin.xml" target="package" inheritAll="false">
+      <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+      <property name="hadoop.home" value="${hadoop.root}"/>
+    </ant>
+  </target>
+
+  <target name="test" unless="testcase">
+    <echo message="Project: ${ant.project.name}"/>
+    <ant antfile="build-plugin.xml" target="test" inheritAll="false">
+      <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+      <property name="hadoop.home" value="${hadoop.root}"/>
+    </ant>
+  </target>
+
+  <target name="clean">
+    <echo message="Project: ${ant.project.name}"/>
+    <ant antfile="build-plugin.xml" target="clean" inheritAll="false">
+      <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+      <property name="hadoop.home" value="${hadoop.root}"/>
+    </ant>
+  </target>
+</project>

Added: hive/trunk/builtins/ivy.xml
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/ivy.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/ivy.xml (added)
+++ hive/trunk/builtins/ivy.xml Fri Dec  2 08:14:10 2011
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<ivy-module version="2.0">
+    <info organisation="${hive.ivy.org}" module="hive-builtins" 
revision="${version}">
+      <license name="The Apache Software License, Version 2.0" 
url="http://www.apache.org/licenses/LICENSE-2.0.txt"; />
+      <description homepage="http://hive.apache.org";>
+        The Apache Hive (TM) data warehouse software facilitates querying and 
managing large datasets residing in distributed storage.
+        https://cwiki.apache.org/confluence/display/Hive/Home
+      </description>
+    </info>
+    <dependencies>
+    </dependencies>
+</ivy-module>

Added: hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java (added)
+++ hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java Fri Dec  
2 08:14:10 2011
@@ -0,0 +1,28 @@
+/**
+ * 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.hive.builtins;
+
+/**
+ * Utility method class supporting builtin functions.  We also
+ * use this class as a well-known name for loading metadata from
+ * the builtins jar.
+ */
+public abstract class BuiltinUtils
+{
+}

Added: hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java (added)
+++ hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java Fri Dec  
2 08:14:10 2011
@@ -0,0 +1,127 @@
+/**
+ * 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.hive.builtins;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hive.pdk.HivePdkUnitTest;
+import org.apache.hive.pdk.HivePdkUnitTests;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
+import 
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.AggregationBuffer;
+import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+
+/**
+ * Aggregate all maps into a single map. If there are multiple values for
+ * the same key, result can contain any of those values.
+ * Because the mappers must keep all of the data in memory, if your data is
+ * non-trivially large you should set hive.map.aggr=false to ensure that
+ * UNION_MAP is only executed in the reduce phase.
+ */
+@HivePdkUnitTests(
+  setup = "",
+  cleanup = "",
+  cases = {
+    @HivePdkUnitTest(
+      query = "SELECT size(UNION_MAP(MAP(sepal_width, sepal_length))) "
+      +"FROM iris",
+      result = "23")
+  })
+@Description(
+  name = "union_map",
+  value = "_FUNC_(col) - aggregate given maps into a single map",
+  extended = "Aggregate maps, returns as a HashMap.")
+public class UDAFUnionMap extends AbstractGenericUDAFResolver {
+  @Override
+  public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws 
SemanticException {
+
+    // Next two validation calls are dependent on HIVE-2524, so
+    // leave them commented out for now.
+    //
+    // new LengthEquals(1).check(parameters.length);
+    // new IsMap().check(parameters[0], 0);
+
+    return new Evaluator();
+  }
+
+  public static class State implements AggregationBuffer {
+    HashMap<Object, Object> map = new HashMap<Object, Object>();
+  }
+
+  public static class Evaluator extends GenericUDAFEvaluator {
+    ObjectInspector inputOI;
+    MapObjectInspector internalMergeOI;
+
+    @Override
+    public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws 
HiveException {
+      super.init(m, parameters);
+      if (m == Mode.COMPLETE || m == Mode.PARTIAL1) {
+        inputOI = (MapObjectInspector) parameters[0];
+      } else {
+        internalMergeOI = (MapObjectInspector) parameters[0];
+      }
+      return ObjectInspectorUtils.getStandardObjectInspector(parameters[0]);
+    }
+
+    @Override
+    public AggregationBuffer getNewAggregationBuffer() throws HiveException {
+      return new State();
+    }
+
+    @Override
+    public void iterate(AggregationBuffer agg, Object[] input) throws 
HiveException {
+      if (input[0] != null) {
+        State state = (State) agg;
+        
state.map.putAll((Map<?,?>)ObjectInspectorUtils.copyToStandardObject(input[0], 
inputOI));
+      }
+    }
+
+    @Override
+    public void merge(AggregationBuffer agg, Object partial) throws 
HiveException {
+      if (partial != null) {
+        State state = (State) agg;
+        Map<?,?> pset = 
(Map<?,?>)ObjectInspectorUtils.copyToStandardObject(partial, internalMergeOI);
+        state.map.putAll(pset);
+      }
+    }
+
+    @Override
+    public void reset(AggregationBuffer agg) throws HiveException {
+      ((State) agg).map.clear();
+    }
+
+    @Override
+    public Object terminate(AggregationBuffer agg) throws HiveException {
+      return ((State) agg).map;
+    }
+
+    @Override
+    public Object terminatePartial(AggregationBuffer agg) throws HiveException 
{
+      return ((State) agg).map;
+    }
+  }
+}

Added: hive/trunk/builtins/test/cleanup.sql
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/test/cleanup.sql?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/cleanup.sql (added)
+++ hive/trunk/builtins/test/cleanup.sql Fri Dec  2 08:14:10 2011
@@ -0,0 +1,2 @@
+drop table if exists onerow;
+drop table if exists iris;

Added: hive/trunk/builtins/test/iris.txt
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/test/iris.txt?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/iris.txt (added)
+++ hive/trunk/builtins/test/iris.txt Fri Dec  2 08:14:10 2011
@@ -0,0 +1,150 @@
+6      2.9     4.5     1.5     versicolor
+6.9    3.1     5.1     2.3     virginica
+5.4    3.4     1.5     0.4     setosa
+5.5    3.5     1.3     0.2     setosa
+4.6    3.1     1.5     0.2     setosa
+4.4    2.9     1.4     0.2     setosa
+5.9    3       4.2     1.5     versicolor
+5.1    3.8     1.6     0.2     setosa
+5      3.6     1.4     0.2     setosa
+6.7    3.1     5.6     2.4     virginica
+4.9    3.6     1.4     0.1     setosa
+4.9    2.5     4.5     1.7     virginica
+5.8    2.8     5.1     2.4     virginica
+4.5    2.3     1.3     0.3     setosa
+6.7    3       5.2     2.3     virginica
+6      3       4.8     1.8     virginica
+6.4    3.2     4.5     1.5     versicolor
+7.7    3.8     6.7     2.2     virginica
+5.7    2.6     3.5     1       versicolor
+5.7    2.9     4.2     1.3     versicolor
+5.4    3.9     1.7     0.4     setosa
+5      3.5     1.3     0.3     setosa
+6      2.2     5       1.5     virginica
+6.6    2.9     4.6     1.3     versicolor
+5.9    3       5.1     1.8     virginica
+4.7    3.2     1.6     0.2     setosa
+5      3.4     1.5     0.2     setosa
+6.9    3.2     5.7     2.3     virginica
+6.5    3       5.8     2.2     virginica
+5.5    4.2     1.4     0.2     setosa
+7.1    3       5.9     2.1     virginica
+6.2    2.9     4.3     1.3     versicolor
+5.7    4.4     1.5     0.4     setosa
+4.9    2.4     3.3     1       versicolor
+5.4    3.9     1.3     0.4     setosa
+6.4    2.8     5.6     2.1     virginica
+6.9    3.1     4.9     1.5     versicolor
+5.9    3.2     4.8     1.8     versicolor
+6.1    3       4.9     1.8     virginica
+5.6    3       4.5     1.5     versicolor
+5.3    3.7     1.5     0.2     setosa
+6.4    2.9     4.3     1.3     versicolor
+6.6    3       4.4     1.4     versicolor
+6.4    3.1     5.5     1.8     virginica
+6.3    2.5     4.9     1.5     versicolor
+6.7    3.3     5.7     2.5     virginica
+6.4    2.7     5.3     1.9     virginica
+6.5    3       5.5     1.8     virginica
+6.7    3.1     4.4     1.4     versicolor
+4.9    3       1.4     0.2     setosa
+6.2    2.8     4.8     1.8     virginica
+7.6    3       6.6     2.1     virginica
+5.2    3.5     1.5     0.2     setosa
+7.7    2.6     6.9     2.3     virginica
+6.5    3.2     5.1     2       virginica
+5.8    2.6     4       1.2     versicolor
+6.3    2.9     5.6     1.8     virginica
+5.8    4       1.2     0.2     setosa
+6.5    2.8     4.6     1.5     versicolor
+5      3.2     1.2     0.2     setosa
+7.4    2.8     6.1     1.9     virginica
+7      3.2     4.7     1.4     versicolor
+4.8    3.4     1.6     0.2     setosa
+6.4    2.8     5.6     2.2     virginica
+5.4    3.7     1.5     0.2     setosa
+5.7    3.8     1.7     0.3     setosa
+5.2    2.7     3.9     1.4     versicolor
+6.3    3.3     6       2.5     virginica
+5.1    2.5     3       1.1     versicolor
+7.7    2.8     6.7     2       virginica
+5.5    2.4     3.7     1       versicolor
+7.3    2.9     6.3     1.8     virginica
+4.3    3       1.1     0.1     setosa
+5.6    2.7     4.2     1.3     versicolor
+7.9    3.8     6.4     2       virginica
+5.6    2.8     4.9     2       virginica
+5      3       1.6     0.2     setosa
+6.1    3       4.6     1.4     versicolor
+5.1    3.5     1.4     0.2     setosa
+5.1    3.4     1.5     0.2     setosa
+4.8    3.4     1.9     0.2     setosa
+4.6    3.4     1.4     0.3     setosa
+6.5    3       5.2     2       virginica
+5.1    3.8     1.9     0.4     setosa
+5.6    2.9     3.6     1.3     versicolor
+6.7    3       5       1.7     versicolor
+7.2    3.6     6.1     2.5     virginica
+4.9    3.1     1.5     0.1     setosa
+6.2    3.4     5.4     2.3     virginica
+5.8    2.7     5.1     1.9     virginica
+5.6    2.5     3.9     1.1     versicolor
+6.3    2.5     5       1.9     virginica
+4.6    3.2     1.4     0.2     setosa
+5.8    2.7     5.1     1.9     virginica
+5.5    2.3     4       1.3     versicolor
+6.7    3.3     5.7     2.1     virginica
+6      2.2     4       1       versicolor
+5.1    3.7     1.5     0.4     setosa
+5      3.5     1.6     0.6     setosa
+5.8    2.7     4.1     1       versicolor
+5.7    2.8     4.1     1.3     versicolor
+6      3.4     4.5     1.6     versicolor
+6.1    2.9     4.7     1.4     versicolor
+5.2    3.4     1.4     0.2     setosa
+5.6    3       4.1     1.3     versicolor
+6.8    2.8     4.8     1.4     versicolor
+5.8    2.7     3.9     1.2     versicolor
+4.8    3.1     1.6     0.2     setosa
+5.1    3.5     1.4     0.3     setosa
+5      3.3     1.4     0.2     setosa
+7.2    3.2     6       1.8     virginica
+6.7    3.1     4.7     1.5     versicolor
+6.8    3.2     5.9     2.3     virginica
+4.6    3.6     1       0.2     setosa
+5.4    3       4.5     1.5     versicolor
+6.4    3.2     5.3     2.3     virginica
+4.8    3       1.4     0.1     setosa
+5.5    2.5     4       1.3     versicolor
+6.9    3.1     5.4     2.1     virginica
+6.8    3       5.5     2.1     virginica
+4.8    3       1.4     0.3     setosa
+6.3    2.7     4.9     1.8     virginica
+6      2.7     5.1     1.6     versicolor
+6.1    2.6     5.6     1.4     virginica
+7.2    3       5.8     1.6     virginica
+5      2.3     3.3     1       versicolor
+6.3    3.3     4.7     1.6     versicolor
+6.3    2.8     5.1     1.5     virginica
+4.7    3.2     1.3     0.2     setosa
+6.3    3.4     5.6     2.4     virginica
+5.7    2.8     4.5     1.3     versicolor
+5.7    3       4.2     1.2     versicolor
+4.9    3.1     1.5     0.2     setosa
+5      2       3.5     1       versicolor
+7.7    3       6.1     2.3     virginica
+5.7    2.5     5       2       virginica
+5.5    2.4     3.8     1.1     versicolor
+5.1    3.3     1.7     0.5     setosa
+6.3    2.3     4.4     1.3     versicolor
+4.4    3       1.3     0.2     setosa
+6.1    2.8     4       1.3     versicolor
+6.1    2.8     4.7     1.2     versicolor
+5.5    2.6     4.4     1.2     versicolor
+5.1    3.8     1.5     0.3     setosa
+4.4    3.2     1.3     0.2     setosa
+5      3.4     1.6     0.4     setosa
+6.7    2.5     5.8     1.8     virginica
+5.2    4.1     1.5     0.1     setosa
+6.2    2.2     4.5     1.5     versicolor
+5.4    3.4     1.7     0.2     setosa

Added: hive/trunk/builtins/test/onerow.txt
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/test/onerow.txt?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/onerow.txt (added)
+++ hive/trunk/builtins/test/onerow.txt Fri Dec  2 08:14:10 2011
@@ -0,0 +1 @@
+plugh

Added: hive/trunk/builtins/test/setup.sql
URL: 
http://svn.apache.org/viewvc/hive/trunk/builtins/test/setup.sql?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/setup.sql (added)
+++ hive/trunk/builtins/test/setup.sql Fri Dec  2 08:14:10 2011
@@ -0,0 +1,10 @@
+create table onerow(s string);
+load data local inpath '${env:HIVE_PLUGIN_ROOT_DIR}/test/onerow.txt'
+overwrite into table onerow;
+create table iris(
+sepal_length string, sepal_width string,
+petal_length string, petal_width string,
+species string)
+row format delimited fields terminated by '\t' stored as textfile;
+load data local inpath '${env:HIVE_PLUGIN_ROOT_DIR}/test/iris.txt'
+overwrite into table iris;

Modified: hive/trunk/eclipse-templates/.classpath
URL: 
http://svn.apache.org/viewvc/hive/trunk/eclipse-templates/.classpath?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/eclipse-templates/.classpath (original)
+++ hive/trunk/eclipse-templates/.classpath Fri Dec  2 08:14:10 2011
@@ -69,6 +69,7 @@
   <classpathentry excluding="queries/|results/|templates/" kind="src" 
path="hbase-handler/src/test"/>
   <classpathentry kind="src" path="pdk/src/java"/>
   <classpathentry kind="src" path="pdk/test-plugin/src"/>
+  <classpathentry kind="src" path="builtins/src/java"/>
   <classpathentry kind="src" path="cli/src/test"/>
   <classpathentry kind="output" path="build/eclipse-classes"/>
 </classpath>

Modified: hive/trunk/pdk/scripts/build-plugin.xml
URL: 
http://svn.apache.org/viewvc/hive/trunk/pdk/scripts/build-plugin.xml?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/pdk/scripts/build-plugin.xml (original)
+++ hive/trunk/pdk/scripts/build-plugin.xml Fri Dec  2 08:14:10 2011
@@ -59,10 +59,14 @@
     </javac>
   </target>
 
-  <target name="jar" depends="compile">
+  <target name="jar" depends="extract-functions">
     <jar
       jarfile="${build.dir}/${plugin.jar.basename}"
       basedir="${build.classes}">
+      <metainf dir="${build.metadata}">
+        <include name="class-info.xml"/>
+        <include name="class-registration.sql"/>
+      </metainf>
       <manifest>
         <attribute name="Implementation-Title" value="${plugin.title}"/>
         <attribute name="Implementation-Version" value="${plugin.version}"/>
@@ -111,7 +115,7 @@
     <delete quiet="true" dir="${build.dir}"/>
   </target>
 
-  <target name="package" depends="jar,extract-functions"/>
+  <target name="package" depends="jar"/>
 
   <target name="test" depends="package" unless="testcase">
     <junit fork="true" printsummary="on" haltonfailure="true"

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java 
Fri Dec  2 08:14:10 2011
@@ -18,7 +18,9 @@
 
 package org.apache.hadoop.hive.ql.exec;
 
+import java.io.InputStream;
 import java.lang.reflect.Method;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -30,6 +32,9 @@ import java.util.TreeSet;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -212,8 +217,13 @@ import org.apache.hadoop.hive.serde2.typ
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.util.ReflectionUtils;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * FunctionRegistry.
@@ -1130,6 +1140,82 @@ public final class FunctionRegistry {
     return UDFOPPositive.class == udfClass;
   }
 
+  /**
+   * Registers the appropriate kind of temporary function based on a class's
+   * type.
+   *
+   * @param functionName name under which to register function
+   *
+   * @param udfClass class implementing UD[A|T]F
+   *
+   * @return true if udfClass's type was recognized (so registration
+   * succeeded); false otherwise
+   */
+  public static boolean registerTemporaryFunction(
+    String functionName, Class<?> udfClass) {
+
+    if (UDF.class.isAssignableFrom(udfClass)) {
+      FunctionRegistry.registerTemporaryUDF(
+        functionName, (Class<? extends UDF>) udfClass, false);
+    } else if (GenericUDF.class.isAssignableFrom(udfClass)) {
+      FunctionRegistry.registerTemporaryGenericUDF(
+        functionName, (Class<? extends GenericUDF>) udfClass);
+    } else if (GenericUDTF.class.isAssignableFrom(udfClass)) {
+      FunctionRegistry.registerTemporaryGenericUDTF(
+        functionName, (Class<? extends GenericUDTF>) udfClass);
+    } else if (UDAF.class.isAssignableFrom(udfClass)) {
+      FunctionRegistry.registerTemporaryUDAF(
+        functionName, (Class<? extends UDAF>) udfClass);
+    } else if (GenericUDAFResolver.class.isAssignableFrom(udfClass)) {
+      FunctionRegistry.registerTemporaryGenericUDAF(
+        functionName, (GenericUDAFResolver)
+        ReflectionUtils.newInstance(udfClass, null));
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Registers Hive functions from a plugin jar, using metadata from
+   * the jar's META-INF/class-info.xml.
+   *
+   * @param jarLocation URL for reading jar file
+   *
+   * @param classLoader classloader to use for loading function classes
+   */
+  public static void registerFunctionsFromPluginJar(
+    URL jarLocation,
+    ClassLoader classLoader) throws Exception {
+
+    URL url = new URL("jar:" + jarLocation + "!/META-INF/class-info.xml");
+    InputStream inputStream = null;
+    try {
+      inputStream = url.openStream();
+      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+      DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+      Document doc = docBuilder.parse(inputStream);
+      Element root = doc.getDocumentElement();
+      if (!root.getTagName().equals("ClassList")) {
+        return;
+      }
+      NodeList children = root.getElementsByTagName("Class");
+      for (int i = 0; i < children.getLength(); ++i) {
+        Element child = (Element) children.item(i);
+        String javaName = child.getAttribute("javaname");
+        String sqlName = child.getAttribute("sqlname");
+        Class<?> udfClass = Class.forName(javaName, true, classLoader);
+        boolean registered = registerTemporaryFunction(sqlName, udfClass);
+        if (!registered) {
+          throw new RuntimeException(
+            "Class " + udfClass + " is not a Hive function implementation");
+        }
+      }
+    } finally {
+      IOUtils.closeStream(inputStream);
+    }
+  }
+
   private FunctionRegistry() {
     // prevent instantiation
   }

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java Fri 
Dec  2 08:14:10 2011
@@ -73,32 +73,15 @@ public class FunctionTask extends Task<F
   private int createFunction(CreateFunctionDesc createFunctionDesc) {
     try {
       Class<?> udfClass = getUdfClass(createFunctionDesc);
-      if (UDF.class.isAssignableFrom(udfClass)) {
-        FunctionRegistry.registerTemporaryUDF(createFunctionDesc
-            .getFunctionName(), (Class<? extends UDF>) udfClass, false);
-        return 0;
-      } else if (GenericUDF.class.isAssignableFrom(udfClass)) {
-        FunctionRegistry.registerTemporaryGenericUDF(createFunctionDesc
-            .getFunctionName(), (Class<? extends GenericUDF>) udfClass);
-        return 0;
-      } else if (GenericUDTF.class.isAssignableFrom(udfClass)) {
-        FunctionRegistry.registerTemporaryGenericUDTF(createFunctionDesc
-            .getFunctionName(), (Class<? extends GenericUDTF>) udfClass);
-        return 0;
-      } else if (UDAF.class.isAssignableFrom(udfClass)) {
-        FunctionRegistry.registerTemporaryUDAF(createFunctionDesc
-            .getFunctionName(), (Class<? extends UDAF>) udfClass);
-        return 0;
-      } else if (GenericUDAFResolver.class.isAssignableFrom(udfClass)) {
-        FunctionRegistry.registerTemporaryGenericUDAF(createFunctionDesc
-            .getFunctionName(), (GenericUDAFResolver) ReflectionUtils
-            .newInstance(udfClass, null));
+      boolean registered = FunctionRegistry.registerTemporaryFunction(
+        createFunctionDesc.getFunctionName(),
+        udfClass);
+      if (registered) {
         return 0;
       }
       console.printError("FAILED: Class " + createFunctionDesc.getClassName()
           + " does not implement UDF, GenericUDF, or UDAF");
       return 1;
-
     } catch (ClassNotFoundException e) {
       console.printError("FAILED: Class " + createFunctionDesc.getClassName() 
+ " not found");
       LOG.info("create function: " + StringUtils.stringifyException(e));

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java Fri 
Dec  2 08:14:10 2011
@@ -2275,4 +2275,8 @@ public final class Utilities {
 
     return sb.toString();
   }
+
+  public static Class getBuiltinUtilsClass() throws ClassNotFoundException {
+    return Class.forName("org.apache.hive.builtins.BuiltinUtils");
+  }
 }

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java 
Fri Dec  2 08:14:10 2011
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintStream;
 import java.net.URI;
+import java.net.URL;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
@@ -39,6 +40,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.ql.MapRedStats;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.Utilities;
 import org.apache.hadoop.hive.ql.history.HiveHistory;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -174,6 +176,19 @@ public class SessionState {
     this.conf = conf;
     isSilent = conf.getBoolVar(HiveConf.ConfVars.HIVESESSIONSILENT);
     ls = new LineageState();
+
+    // Register the Hive builtins jar and all of its functions
+    try {
+      Class<?> pluginClass = Utilities.getBuiltinUtilsClass();
+      URL jarLocation = pluginClass.getProtectionDomain().getCodeSource()
+        .getLocation();
+      add_builtin_resource(
+        ResourceType.JAR, jarLocation.toString());
+      FunctionRegistry.registerFunctionsFromPluginJar(
+        jarLocation, pluginClass.getClassLoader());
+    } catch (Exception ex) {
+      throw new RuntimeException("Failed to load Hive builtin functions", ex);
+    }
   }
 
   public void setCmd(String cmdString) {
@@ -509,8 +524,8 @@ public class SessionState {
     return null;
   }
 
-  private final HashMap<ResourceType, HashSet<String>> resource_map =
-    new HashMap<ResourceType, HashSet<String>>();
+  private final HashMap<ResourceType, Set<String>> resource_map =
+    new HashMap<ResourceType, Set<String>>();
 
   public String add_resource(ResourceType t, String value) {
     // By default don't convert to unix
@@ -525,23 +540,34 @@ public class SessionState {
       return null;
     }
 
-    if (resource_map.get(t) == null) {
-      resource_map.put(t, new HashSet<String>());
-    }
+    Set<String> resourceMap = getResourceMap(t);
 
     String fnlVal = value;
     if (t.hook != null) {
-      fnlVal = t.hook.preHook(resource_map.get(t), value);
+      fnlVal = t.hook.preHook(resourceMap, value);
       if (fnlVal == null) {
         return fnlVal;
       }
     }
     getConsole().printInfo("Added resource: " + fnlVal);
-    resource_map.get(t).add(fnlVal);
+    resourceMap.add(fnlVal);
 
     return fnlVal;
   }
 
+  public void add_builtin_resource(ResourceType t, String value) {
+    getResourceMap(t).add(value);
+  }
+
+  private Set<String> getResourceMap(ResourceType t) {
+    Set<String> result = resource_map.get(t);
+    if (result == null) {
+      result = new HashSet<String>();
+      resource_map.put(t, result);
+    }
+    return result;
+  }
+
   /**
    * Returns the list of filesystem schemas as regex which
    * are permissible for download as a resource.

Modified: hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out 
(original)
+++ hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out Fri Dec  
2 08:14:10 2011
@@ -155,6 +155,7 @@ to_utc_timestamp
 trim
 ucase
 unhex
+union_map
 unix_timestamp
 upper
 var_pop


Reply via email to