diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java index 33839f7..f0b8e3b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBasePad.java @@ -36,9 +36,11 @@ private transient Converter converter3; private Text result = new Text(); private String udfName; + private StringBuilder builder; public GenericUDFBasePad(String _udfName) { this.udfName = _udfName; + this.builder = new StringBuilder(); } @Override @@ -68,17 +70,10 @@ public Object evaluate(DeferredObject[] arguments) throws HiveException { return null; } int len = lenW.get(); + builder.setLength(0); - byte[] data = result.getBytes(); - if (data.length < len) { - data = new byte[len]; - } - - byte[] txt = str.getBytes(); - byte[] padTxt = pad.getBytes(); - - performOp(data, txt, padTxt, len, str, pad); - result.set(data, 0, len); + performOp(builder, len, str.toString(), pad.toString()); + result.set(builder.toString()); return result; } @@ -87,8 +82,8 @@ public String getDisplayString(String[] children) { return getStandardDisplayString(udfName, children); } - protected abstract void performOp(byte[] data, byte[] txt, byte[] padTxt, int len, Text str, - Text pad); + protected abstract void performOp( + StringBuilder builder, int len, String str, String pad); // Convert input arguments to Text, if necessary. private Converter checkTextArguments(ObjectInspector[] arguments, int i) diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java index f15a869..32b2ea2 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLpad.java @@ -39,21 +39,17 @@ public GenericUDFLpad() { } @Override - protected void performOp(byte[] data, byte[] txt, byte[] padTxt, int len, Text str, Text pad) { - // The length of the padding needed - int pos = Math.max(len - str.getLength(), 0); + protected void performOp( + StringBuilder builder, int len, String str, String pad) { + int pos = Math.max(len - str.length(), 0); - // Copy the padding - for (int i = 0; i < pos; i += pad.getLength()) { - for (int j = 0; j < pad.getLength() && j < pos - i; j++) { - data[i + j] = padTxt[j]; - } + for (int i = 0; i < pos; i += pad.length()) { + builder.append(pad); } + builder.setLength(pos); // Copy the text - for (int i = 0; pos + i < len && i < str.getLength(); i++) { - data[pos + i] = txt[i]; - } + builder.append(str, 0, str.length()); + builder.setLength(len); } - } diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java index b512332..a063b37 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFRpad.java @@ -38,19 +38,17 @@ public GenericUDFRpad() { } @Override - protected void performOp(byte[] data, byte[] txt, byte[] padTxt, int len, Text str, Text pad) { - int pos; + protected void performOp( + StringBuilder builder, int len, String str, String pad) { + int pos = str.length(); // Copy the text - for (pos = 0; pos < str.getLength() && pos < len; pos++) { - data[pos] = txt[pos]; - } + builder.append(str, 0, pos); // Copy the padding while (pos < len) { - for (int i = 0; i < pad.getLength() && i < len - pos; i++) { - data[pos + i] = padTxt[i]; - } - pos += pad.getLength(); + builder.append(pad); + pos += pad.length(); } + builder.setLength(len); } } diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java index 6344417..f2d1fa9 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLpad.java @@ -41,6 +41,8 @@ public void testLpad() throws HiveException { udf.initialize(arguments); runAndVerify("hi", 5, "??", "???hi", udf); runAndVerify("hi", 1, "??", "h", udf); + runAndVerify("hi", 5, "??", "???hi", udf); + runAndVerify("hi", 1, "??", "h", udf); } private void runAndVerify(String str, int len, String pad, String expResult, GenericUDF udf) diff --git ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java index 71ffcb9..62908fd 100644 --- ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java +++ ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFRpad.java @@ -31,16 +31,18 @@ public class TestGenericUDFRpad extends TestCase { - public void testLpad() throws HiveException { - GenericUDFLpad udf = new GenericUDFLpad(); + public void testRpad() throws HiveException { + GenericUDFRpad udf = new GenericUDFRpad(); ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableStringObjectInspector; ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableIntObjectInspector; ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableStringObjectInspector; ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3 }; udf.initialize(arguments); - runAndVerify("hi", 5, "??", "???hi", udf); + runAndVerify("hi", 5, "??", "hi???", udf); runAndVerify("hi", 1, "??", "h", udf); + runAndVerify("hi", 5, "??", "hi???", udf); + runAndVerify("hi", 1, "??", "h", udf); } private void runAndVerify(String str, int len, String pad, String expResult, GenericUDF udf) @@ -50,6 +52,6 @@ private void runAndVerify(String str, int len, String pad, String expResult, Gen DeferredObject valueObj3 = new DeferredJavaObject(new Text(pad)); DeferredObject[] args = { valueObj1, valueObj2, valueObj3 }; Text output = (Text) udf.evaluate(args); - assertEquals("lpad() test ", expResult, output.toString()); + assertEquals("rpad() test ", expResult, output.toString()); } }