[ https://issues.apache.org/jira/browse/PHOENIX-1705?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14389890#comment-14389890 ]
James Taylor commented on PHOENIX-1705: --------------------------------------- Thanks for the revisions, [~Dumindux]. Below is some feedback. In general, you shouldn't need any specific checks against a particular PDataType instance in your code, so remove all these. - In ArrayAppendFunction constructor, it should look like this: {code} + public ArrayAppendFunction(List<Expression> children) throws TypeMismatchException { + super(children); + + if (!getElementDataType().isCoercibleTo(getBaseType())) { + throw TypeMismatchException.newException(getBaseType(), getElementDataType()); + } + + // If the base type of an element is fixed width, make sure the element being appended will fit + if (getBaseType().isFixedWidth() && getArrayExpr().getMaxLength() != null && + getElementExpr().getMaxLength() != null && getElementExpr().getMaxLength() > getArrayExpr().getMaxLength()) { + throw new DataExceedsCapacityException(); + } + // If the base type has a scale, make sure the element being appended has a scale less than or equal to it + if (getArrayExpr().getScale() != null && getElementExpr().getScale() != null && + getElementExpr().getScale() > getArrayExpr().getScale()) { + throw new DataExceedsCapacityException(getBaseType(), getArrayExpr().getMaxLength(), getArrayExpr().getScale()); + } + } + {code} - the evaluate method should look like this (you've got the wrong arguments to isSizeCompatible - take a look at example callers of that if you're not sure next time): {code} + @Override + public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { + + if (!getArrayExpr().evaluate(tuple, ptr)) { + return false; + } else if (ptr.getLength() == 0) { + return true; + } + int arrayLength = PArrayDataType.getArrayLength(ptr, getBaseType(), getArrayExpr().getMaxLength()); + + int length = ptr.getLength(); + int offset = ptr.getOffset(); + byte[] arrayBytes = ptr.get(); + + if (!getElementExpr().evaluate(tuple, ptr) || ptr.getLength() == 0) { + ptr.set(arrayBytes, offset, length); + return true; + } + // See if actual value for the element being appended will fit into the array given its constraints + if (!getBaseType().isSizeCompatible(ptr, null, getElementDataType(), getElementExpr().getMaxLength(), getElementExpr().getScale(), getArrayExpr().getMaxLength(), getArrayExpr().getScale()) { + throw new DataExceedsCapacityException(); + } + + getBaseType().coerceBytes(ptr, getElementDataType(), getElementExpr().getSortOrder(), getArrayExpr().getSortOrder(), getMaxLength()); + + return PArrayDataType.appendItemToArray(ptr, length, offset, arrayBytes, getBaseType(), arrayLength, getMaxLength()); {code} - Check what the default error message is for DataExceedsCapacityException and if it's reasonable, then don't include a specific error message in your constructor for it. > implement ARRAY_APPEND built in function > ---------------------------------------- > > Key: PHOENIX-1705 > URL: https://issues.apache.org/jira/browse/PHOENIX-1705 > Project: Phoenix > Issue Type: Sub-task > Reporter: Dumindu Buddhika > Assignee: Dumindu Buddhika > Attachments: > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function1.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function10.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function2.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function3.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function4.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function5.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function6.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function7.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function8.patch, > PHOENIX-1705_implement_ARRAY_APPEND_built_in_function9.patch > > -- This message was sent by Atlassian JIRA (v6.3.4#6332)