Index: ql/src/test/queries/clientpositive/udf_xpath_short.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_short.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_short.q (revision 0) @@ -0,0 +1,11 @@ +DESCRIBE FUNCTION xpath_short ; +DESCRIBE FUNCTION EXTENDED xpath_short ; + +SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ; +SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1 ; +SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1 ; +SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1 ; +SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_xpath_long.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_long.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_long.q (revision 0) @@ -0,0 +1,11 @@ +DESCRIBE FUNCTION xpath_long ; +DESCRIBE FUNCTION EXTENDED xpath_long ; + +SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ; +SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1 ; +SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1 ; +SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1 ; +SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ; Index: ql/src/test/queries/clientpositive/udf_xpath.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath.q (revision 0) @@ -0,0 +1,8 @@ +DESCRIBE FUNCTION xpath ; +DESCRIBE FUNCTION EXTENDED xpath ; + +SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1 ; +SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1 ; +SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1 ; +SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1 ; +SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1 ; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_xpath_string.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_string.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_string.q (revision 0) @@ -0,0 +1,11 @@ +DESCRIBE FUNCTION xpath_string ; +DESCRIBE FUNCTION EXTENDED xpath_string ; + +SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1 ; +SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1 ; +SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1 ; +SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1 ; +SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1 ; +SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1 ; +SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1 ; Index: ql/src/test/queries/clientpositive/udf_xpath_double.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_double.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_double.q (revision 0) @@ -0,0 +1,14 @@ +DESCRIBE FUNCTION xpath_number ; +DESCRIBE FUNCTION EXTENDED xpath_number ; + +DESCRIBE FUNCTION xpath_double ; +DESCRIBE FUNCTION EXTENDED xpath_double ; + +SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ; +SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1 ; +SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1 ; +SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1 ; +SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_xpath_int.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_int.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_int.q (revision 0) @@ -0,0 +1,11 @@ +DESCRIBE FUNCTION xpath_int ; +DESCRIBE FUNCTION EXTENDED xpath_int ; + +SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ; +SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1 ; +SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1 ; +SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1 ; +SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_xpath_boolean.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_boolean.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_boolean.q (revision 0) @@ -0,0 +1,9 @@ +DESCRIBE FUNCTION xpath_boolean ; +DESCRIBE FUNCTION EXTENDED xpath_boolean ; + +SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1 ; +SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1 ; +SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1 ; +SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1 ; +SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1 ; Index: ql/src/test/queries/clientpositive/udf_xpath_float.q =================================================================== --- ql/src/test/queries/clientpositive/udf_xpath_float.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_xpath_float.q (revision 0) @@ -0,0 +1,11 @@ +DESCRIBE FUNCTION xpath_float ; +DESCRIBE FUNCTION EXTENDED xpath_float ; + +SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1 ; +SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ; +SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1 ; +SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1 ; +SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1 ; +SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1 ; +SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ; \ No newline at end of file Index: ql/src/test/results/clientpositive/show_functions.q.out =================================================================== --- ql/src/test/results/clientpositive/show_functions.q.out (revision 896321) +++ ql/src/test/results/clientpositive/show_functions.q.out (working copy) @@ -121,6 +121,15 @@ variance weekofyear when +xpath +xpath_boolean +xpath_double +xpath_float +xpath_int +xpath_long +xpath_number +xpath_short +xpath_string year | ~ @@ -160,6 +169,7 @@ to_date ucase variance +xpath_double PREHOOK: query: SHOW FUNCTIONS 'log.*' PREHOOK: type: SHOWFUNCTIONS POSTHOOK: query: SHOW FUNCTIONS 'log.*' Index: ql/src/test/results/clientpositive/udf_xpath_boolean.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_boolean.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_boolean.q.out (revision 0) @@ -0,0 +1,69 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_boolean +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_boolean +POSTHOOK: type: DESCFUNCTION +xpath_boolean(xml, xpath) - Evaluates a boolean xpath expression, or true if element found +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_boolean +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_boolean +POSTHOOK: type: DESCFUNCTION +xpath_boolean(xml, xpath) - Evaluates a boolean xpath expression, or true if element found +Example: + > SELECT xpath_boolean('1','a/b') FROM src LIMIT 1; + true + > SELECT xpath_boolean('1','a/b = 2') FROM src LIMIT 1; + false +PREHOOK: query: SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1945419737/10000 +POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1945419737/10000 +true +PREHOOK: query: SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1442252861/10000 +POSTHOOK: query: SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1442252861/10000 +false +PREHOOK: query: SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2101627340/10000 +POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2101627340/10000 +true +PREHOOK: query: SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/304332506/10000 +POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/304332506/10000 +false +PREHOOK: query: SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1021196134/10000 +POSTHOOK: query: SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1021196134/10000 +false +PREHOOK: query: SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2134445341/10000 +POSTHOOK: query: SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2134445341/10000 +true Index: ql/src/test/results/clientpositive/udf_xpath_int.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_int.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_int.q.out (revision 0) @@ -0,0 +1,85 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_int +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_int +POSTHOOK: type: DESCFUNCTION +xpath_int(xml, xpath) - Returns an integer value within xml that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_int +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_int +POSTHOOK: type: DESCFUNCTION +xpath_int(xml, xpath) - Returns an integer value within xml that matches the xpath expression +Example: + > SELECT xpath_int('12','sum(a/b)') FROM src LIMIT 1; + 3 +PREHOOK: query: SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2012913246/10000 +POSTHOOK: query: SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2012913246/10000 +0 +PREHOOK: query: SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/861975272/10000 +POSTHOOK: query: SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/861975272/10000 +0 +PREHOOK: query: SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/541934033/10000 +POSTHOOK: query: SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/541934033/10000 +2147483647 +PREHOOK: query: SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/666093838/10000 +POSTHOOK: query: SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/666093838/10000 +0 +PREHOOK: query: SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1075222896/10000 +POSTHOOK: query: SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1075222896/10000 +1 +PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1252115455/10000 +POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1252115455/10000 +15 +PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/36642850/10000 +POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/36642850/10000 +7 +PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1694899837/10000 +POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1694899837/10000 +5 Index: ql/src/test/results/clientpositive/udf_xpath.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath.q.out (revision 0) @@ -0,0 +1,62 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath +POSTHOOK: type: DESCFUNCTION +xpath(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath +POSTHOOK: type: DESCFUNCTION +xpath(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression +Example: + > SELECT xpath('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1 + [] + > SELECT xpath('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1 + ["b1","b2","b3"] + > SELECT xpath('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1 + ["c1","c2"] +PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1416181007/10000 +POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1416181007/10000 +[] +PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1851591863/10000 +POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1851591863/10000 +["b1","b2","b3","c1","c2"] +PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/113811557/10000 +POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/113811557/10000 +["b1","b2","b3"] +PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1674548693/10000 +POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1674548693/10000 +["c1","c2"] +PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/378718949/10000 +POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/378718949/10000 +["b1","c1"] Index: ql/src/test/results/clientpositive/udf_xpath_float.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_float.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_float.q.out (revision 0) @@ -0,0 +1,85 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_float +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_float +POSTHOOK: type: DESCFUNCTION +xpath_float(xml, xpath) - Returns a float value that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_float +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_float +POSTHOOK: type: DESCFUNCTION +xpath_float(xml, xpath) - Returns a float value that matches the xpath expression +Example: + > SELECT xpath_float('12','sum(a/b)') FROM src LIMIT 1; + 3.0 +PREHOOK: query: SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/319850862/10000 +POSTHOOK: query: SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/319850862/10000 +NaN +PREHOOK: query: SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1472406597/10000 +POSTHOOK: query: SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1472406597/10000 +NaN +PREHOOK: query: SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1929834936/10000 +POSTHOOK: query: SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1929834936/10000 +8.0E19 +PREHOOK: query: SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2143124123/10000 +POSTHOOK: query: SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2143124123/10000 +0.0 +PREHOOK: query: SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1347257342/10000 +POSTHOOK: query: SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1347257342/10000 +1.0 +PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1226872791/10000 +POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1226872791/10000 +15.0 +PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1024930211/10000 +POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1024930211/10000 +7.0 +PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1463047098/10000 +POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1463047098/10000 +5.0 Index: ql/src/test/results/clientpositive/udf_xpath_long.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_long.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_long.q.out (revision 0) @@ -0,0 +1,85 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_long +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_long +POSTHOOK: type: DESCFUNCTION +xpath_long(xml, xpath) - Returns a long value within xml that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_long +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_long +POSTHOOK: type: DESCFUNCTION +xpath_long(xml, xpath) - Returns a long value within xml that matches the xpath expression +Example: + > SELECT xpath_long('12','sum(a/b)') FROM src LIMIT 1; + 3 +PREHOOK: query: SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184030015/10000 +POSTHOOK: query: SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184030015/10000 +0 +PREHOOK: query: SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/431085143/10000 +POSTHOOK: query: SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/431085143/10000 +0 +PREHOOK: query: SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/771414951/10000 +POSTHOOK: query: SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/771414951/10000 +9223372036854775807 +PREHOOK: query: SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2025818159/10000 +POSTHOOK: query: SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2025818159/10000 +0 +PREHOOK: query: SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1726288893/10000 +POSTHOOK: query: SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1726288893/10000 +1 +PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/660894673/10000 +POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/660894673/10000 +15 +PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1698584685/10000 +POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1698584685/10000 +7 +PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/517926504/10000 +POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/517926504/10000 +5 Index: ql/src/test/results/clientpositive/udf_xpath_double.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_double.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_double.q.out (revision 0) @@ -0,0 +1,98 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_number +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_number +POSTHOOK: type: DESCFUNCTION +xpath_number(xml, xpath) - Returns a double value that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_number +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_number +POSTHOOK: type: DESCFUNCTION +xpath_number(xml, xpath) - Returns a double value that matches the xpath expression +Example: + > SELECT xpath_number('12','sum(a/b)') FROM src LIMIT 1; + 3.0 +PREHOOK: query: DESCRIBE FUNCTION xpath_double +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_double +POSTHOOK: type: DESCFUNCTION +xpath_double(xml, xpath) - Returns a double value that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_double +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_double +POSTHOOK: type: DESCFUNCTION +xpath_double(xml, xpath) - Returns a double value that matches the xpath expression +Example: + > SELECT xpath_double('12','sum(a/b)') FROM src LIMIT 1; + 3.0 +PREHOOK: query: SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/829340064/10000 +POSTHOOK: query: SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/829340064/10000 +NaN +PREHOOK: query: SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1649714698/10000 +POSTHOOK: query: SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1649714698/10000 +NaN +PREHOOK: query: SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1707207620/10000 +POSTHOOK: query: SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1707207620/10000 +8.0E19 +PREHOOK: query: SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1655907900/10000 +POSTHOOK: query: SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1655907900/10000 +0.0 +PREHOOK: query: SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1817321728/10000 +POSTHOOK: query: SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1817321728/10000 +1.0 +PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1885044524/10000 +POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1885044524/10000 +15.0 +PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/214201114/10000 +POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/214201114/10000 +7.0 +PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/868608861/10000 +POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/868608861/10000 +5.0 Index: ql/src/test/results/clientpositive/udf_xpath_short.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_short.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_short.q.out (revision 0) @@ -0,0 +1,85 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_short +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_short +POSTHOOK: type: DESCFUNCTION +xpath_short(xml, xpath) - Returns a short value that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_short +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_short +POSTHOOK: type: DESCFUNCTION +xpath_short(xml, xpath) - Returns a short value that matches the xpath expression +Example: + > SELECT xpath_short('12','sum(a/b)') FROM src LIMIT 1; + 3 +PREHOOK: query: SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/43003016/10000 +POSTHOOK: query: SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/43003016/10000 +0 +PREHOOK: query: SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/420344977/10000 +POSTHOOK: query: SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/420344977/10000 +0 +PREHOOK: query: SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/542896770/10000 +POSTHOOK: query: SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/542896770/10000 +-1 +PREHOOK: query: SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1699233281/10000 +POSTHOOK: query: SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1699233281/10000 +0 +PREHOOK: query: SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1504264750/10000 +POSTHOOK: query: SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1504264750/10000 +1 +PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1166661278/10000 +POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1166661278/10000 +15 +PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/633201724/10000 +POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/633201724/10000 +7 +PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1825578599/10000 +POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1825578599/10000 +5 Index: ql/src/test/results/clientpositive/udf_xpath_string.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_xpath_string.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_xpath_string.q.out (revision 0) @@ -0,0 +1,91 @@ +PREHOOK: query: DESCRIBE FUNCTION xpath_string +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION xpath_string +POSTHOOK: type: DESCFUNCTION +xpath_string(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression +PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_string +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_string +POSTHOOK: type: DESCFUNCTION +xpath_string(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression +Example: + > SELECT xpath_string('bcc','a/c') FROM src LIMIT 1; + 'cc' + > SELECT xpath_string('b1b2','a/b') FROM src LIMIT 1; + 'b1' + > SELECT xpath_string('b1b2','a/b[2]') FROM src LIMIT 1; + 'b2' + > SELECT xpath_string('b1b2','a') FROM src LIMIT 1; + 'b1b2' +PREHOOK: query: SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/940874235/10000 +POSTHOOK: query: SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/940874235/10000 +bbcc +PREHOOK: query: SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1447930808/10000 +POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1447930808/10000 +bb +PREHOOK: query: SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1556430756/10000 +POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1556430756/10000 +cc +PREHOOK: query: SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1353144403/10000 +POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1353144403/10000 + +PREHOOK: query: SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1184684106/10000 +POSTHOOK: query: SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1184684106/10000 +b1 +PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184679872/10000 +POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184679872/10000 +b1 +PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1295801804/10000 +POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1295801804/10000 +b2 +PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/885790551/10000 +POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/885790551/10000 +b2 Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java (revision 0) @@ -0,0 +1,37 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_long", + value = "_FUNC_(xml, xpath) - Returns a long value that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n" + + " 3") +public class UDFXPathLong extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + + public long evaluate(String xml, String path) { + return xpath.evalNumber(xml, path).longValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java (revision 0) @@ -0,0 +1,37 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_int", + value = "_FUNC_(xml, xpath) - Returns an integer value that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n" + + " 3") +public class UDFXPathInteger extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + + public int evaluate(String xml, String path) { + return xpath.evalNumber(xml, path).intValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java (revision 0) @@ -0,0 +1,51 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; +import org.apache.hadoop.io.Text; + +@description(name = "xpath_string", + value = "_FUNC_(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('bcc','a/c') FROM src LIMIT 1;\n" + + " 'cc'\n" + + " > SELECT _FUNC_('b1b2','a/b') FROM src LIMIT 1;\n" + + " 'b1'\n" + + " > SELECT _FUNC_('b1b2','a/b[2]') FROM src LIMIT 1;\n" + + " 'b2'\n" + + " > SELECT _FUNC_('b1b2','a') FROM src LIMIT 1;\n" + + " 'b1b2'" + ) +public class UDFXPathString extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + private Text result = new Text(); + + public Text evaluate(String xml, String path) { + String s = xpath.evalString(xml, path); + if (s == null) { + return null; + } + + result.set(s); + return result; + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java (revision 0) @@ -0,0 +1,112 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.apache.hadoop.hive.ql.exec.UDFArgumentException; +import org.apache.hadoop.hive.ql.exec.description; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; +import org.apache.hadoop.io.Text; +import org.w3c.dom.NodeList; + +@description( + name = "xpath", + value = "_FUNC_(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1\n" + + " []\n" + + " > SELECT _FUNC_('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1\n" + + " [\"b1\",\"b2\",\"b3\"]\n" + + " > SELECT _FUNC_('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1\n" + + " [\"c1\",\"c2\"]" + ) +public class GenericUDFXPath extends GenericUDF { + + private static final List emptyResult = Collections.emptyList(); + + private UDFXPathUtil xpath = new UDFXPathUtil(); + private List result = new ArrayList(10); + + private Converter converterArg0; + private Converter converterArg1; + + @Override + public ObjectInspector initialize(ObjectInspector[] arguments) + throws UDFArgumentException { + if (arguments.length != 2) { + throw new UDFArgumentException("Invalid number of arguments."); + } + + converterArg0 = ObjectInspectorConverters.getConverter(arguments[0], + PrimitiveObjectInspectorFactory.writableStringObjectInspector); + converterArg1 = ObjectInspectorConverters.getConverter(arguments[1], + PrimitiveObjectInspectorFactory.writableStringObjectInspector); + + return ObjectInspectorFactory + .getStandardListObjectInspector(PrimitiveObjectInspectorFactory.writableStringObjectInspector); + } + + private List eval(String xml, String path) { + NodeList nodeList = xpath.evalNodeList(xml, path); + if (nodeList == null) { + return emptyResult; + } + + result.clear(); + for (int i = 0; i < nodeList.getLength(); i++) { + String value = nodeList.item(i).getNodeValue(); + if (value != null) { + result.add(new Text(value)); + } + } + + return result; + } + + @Override + public Object evaluate(DeferredObject[] arguments) throws HiveException { + assert (arguments.length == 2); + String xml = converterArg0.convert(arguments[0].get()).toString(); + String path = converterArg1.convert(arguments[1].get()).toString(); + return eval(xml, path); + } + + @Override + public String getDisplayString(String[] children) { + StringBuilder builder = new StringBuilder(); + builder.append("array ("); + if (children.length > 0) { + builder.append("'"); + builder.append(StringUtils.join(children, "','")); + builder.append("'"); + } + builder.append(")"); + return builder.toString(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java (revision 0) @@ -0,0 +1,37 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_short", + value = "_FUNC_(xml, xpath) - Returns a short value that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n" + + " 3") +public class UDFXPathShort extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + + public short evaluate(String xml, String path) { + return xpath.evalNumber(xml, path).shortValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java (revision 0) @@ -0,0 +1,184 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import javax.xml.namespace.QName; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +/** + * Utility class for all XPath UDFs. Each UDF instance should keep an instance + * of this class. + */ +public class UDFXPathUtil { + private XPath xpath = XPathFactory.newInstance().newXPath(); + private ReusableStringReader reader = new ReusableStringReader(); + private InputSource inputSource = new InputSource(reader); + private XPathExpression expression = null; + private String oldPath = null; + + public Object eval(String xml, String path, QName qname) { + if (xml == null || path == null || qname == null) { + return null; + } + + if (xml.length() == 0 || path.length() == 0) { + return null; + } + + if (!path.equals(oldPath)) { + try { + expression = xpath.compile(path); + } catch (XPathExpressionException e) { + expression = null; + } + oldPath = path; + } + + if (expression == null) { + return null; + } + + reader.set(xml); + + try { + return expression.evaluate(inputSource, qname); + } catch (XPathExpressionException e) { + throw new RuntimeException ("Invalid expression '" + oldPath + "'"); + } + } + + public Boolean evalBoolean(String xml, String path) { + return (Boolean) eval(xml, path, XPathConstants.BOOLEAN); + } + + public String evalString(String xml, String path) { + return (String) eval(xml, path, XPathConstants.STRING); + } + + public Double evalNumber(String xml, String path) { + return (Double) eval(xml, path, XPathConstants.NUMBER); + } + + public Node evalNode(String xml, String path) { + return (Node) eval(xml, path, XPathConstants.NODE); + } + + public NodeList evalNodeList(String xml, String path) { + return (NodeList) eval(xml, path, XPathConstants.NODESET); + } + + /** + * Reusable, non-threadsafe version of {@link StringReader}. + */ + public static class ReusableStringReader extends Reader { + + private String str = null; + private int length = -1; + private int next = 0; + private int mark = 0; + + public ReusableStringReader() { + } + + public void set(String s) { + this.str = s; + this.length = s.length(); + this.mark = 0; + this.next = 0; + } + + /** Check to make sure that the stream has not been closed */ + private void ensureOpen() throws IOException { + if (str == null) + throw new IOException("Stream closed"); + } + + public int read() throws IOException { + ensureOpen(); + if (next >= length) + return -1; + return str.charAt(next++); + } + + public int read(char cbuf[], int off, int len) throws IOException { + ensureOpen(); + if ((off < 0) || (off > cbuf.length) || (len < 0) + || ((off + len) > cbuf.length) || ((off + len) < 0)) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + if (next >= length) + return -1; + int n = Math.min(length - next, len); + str.getChars(next, next + n, cbuf, off); + next += n; + return n; + } + + public long skip(long ns) throws IOException { + ensureOpen(); + if (next >= length) + return 0; + // Bound skip by beginning and end of the source + long n = Math.min(length - next, ns); + n = Math.max(-next, n); + next += n; + return n; + } + + public boolean ready() throws IOException { + ensureOpen(); + return true; + } + + public boolean markSupported() { + return true; + } + + public void mark(int readAheadLimit) throws IOException { + if (readAheadLimit < 0) { + throw new IllegalArgumentException("Read-ahead limit < 0"); + } + ensureOpen(); + mark = next; + } + + public void reset() throws IOException { + ensureOpen(); + next = mark; + } + + public void close() { + str = null; + } + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java (revision 0) @@ -0,0 +1,37 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_float", + value = "_FUNC_(xml, xpath) - Returns a float value that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n" + + " 3.0") +public class UDFXPathFloat extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + + public float evaluate(String xml, String path) { + return xpath.evalNumber(xml, path).floatValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java (revision 0) @@ -0,0 +1,39 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_boolean", + value = "_FUNC_(xml, xpath) - Evaluates a boolean xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('1','a/b') FROM src LIMIT 1;\n" + + " true\n" + + " > SELECT _FUNC_('1','a/b = 2') FROM src LIMIT 1;\n" + + " false") +public class UDFXPathBoolean extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil () ; + + public boolean evaluate(String xml, String path) { + return xpath.evalBoolean(xml, path).booleanValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java (revision 0) @@ -0,0 +1,37 @@ +/** + * 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.hadoop.hive.ql.udf.xml; + +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; + +@description( + name = "xpath_number,xpath_double", + value = "_FUNC_(xml, xpath) - Returns a double value that matches the xpath expression", + extended = "Example:\n" + + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n" + + " 3.0") +public class UDFXPathDouble extends UDF { + + private UDFXPathUtil xpath = new UDFXPathUtil(); + + public double evaluate(String xml, String path) { + return xpath.evalNumber(xml, path).doubleValue(); + } +} Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java ___________________________________________________________________ Added: svn:mime-type + text/plain Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (revision 896321) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (working copy) @@ -39,6 +39,7 @@ import org.apache.hadoop.hive.ql.plan.exprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.plan.groupByDesc; import org.apache.hadoop.hive.ql.udf.*; +import org.apache.hadoop.hive.ql.udf.xml.*; import org.apache.hadoop.hive.ql.udf.generic.*; import org.apache.hadoop.hive.serde.Constants; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; @@ -136,6 +137,16 @@ registerUDF("get_json_object", UDFJson.class, false); + registerUDF("xpath_string", UDFXPathString.class, false); + registerUDF("xpath_boolean", UDFXPathBoolean.class, false); + registerUDF("xpath_number", UDFXPathDouble.class, false); + registerUDF("xpath_double", UDFXPathDouble.class, false); + registerUDF("xpath_float", UDFXPathFloat.class, false); + registerUDF("xpath_long", UDFXPathLong.class, false); + registerUDF("xpath_int", UDFXPathInteger.class, false); + registerUDF("xpath_short", UDFXPathShort.class, false); + registerGenericUDF("xpath", GenericUDFXPath.class); + registerUDF("+", UDFOPPlus.class, true); registerUDF("-", UDFOPMinus.class, true); registerUDF("*", UDFOPMultiply.class, true);