@Override public Expression visitLeave(ArrayElemRefNode node, List<Expression> l) throws SQLException { return new ArrayElemRefExpression(l); }
@Override public final <T> T accept(ExpressionVisitor<T> visitor) { List<T> l = acceptChildren(visitor, visitor.visitEnter(this)); T t = visitor.visitLeave(this, l); if (t == null) { t = visitor.defaultReturn(this, l); } return t; } }
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayExpr = children.get(0); return PArrayDataTypeDecoder.positionAtArrayElement(tuple, ptr, index, arrayExpr, getDataType(), getMaxLength()); }
@Test public void testLeadingNulls() throws Exception { List<Expression> children = Lists.newArrayListWithExpectedSize(4); LiteralExpression nullExpression = LiteralExpression.newConstant(null); children.add(nullExpression); children.add(nullExpression); children.add(LiteralExpression.newConstant(BYTE_ARRAY1, PVarbinary.INSTANCE)); children.add(LiteralExpression.newConstant(BYTE_ARRAY2, PVarbinary.INSTANCE)); ArrayConstructorExpression arrayConstructorExpression = new ArrayConstructorExpression(children, PVarbinary.INSTANCE, false); ImmutableBytesPtr ptr = new ImmutableBytesPtr(); ArrayElemRefExpression arrayElemRefExpression = new ArrayElemRefExpression(Lists.<Expression>newArrayList(arrayConstructorExpression)); arrayElemRefExpression.setIndex(1); arrayElemRefExpression.evaluate(null, ptr); assertArrayEquals(ByteUtil.EMPTY_BYTE_ARRAY, ptr.copyBytesIfNecessary()); arrayElemRefExpression.setIndex(2); arrayElemRefExpression.evaluate(null, ptr); assertArrayEquals(ByteUtil.EMPTY_BYTE_ARRAY, ptr.copyBytesIfNecessary()); arrayElemRefExpression.setIndex(3); arrayElemRefExpression.evaluate(null, ptr); assertArrayEquals(BYTE_ARRAY1, ptr.copyBytesIfNecessary()); arrayElemRefExpression.setIndex(4); arrayElemRefExpression.evaluate(null, ptr); assertArrayEquals(BYTE_ARRAY2, ptr.copyBytesIfNecessary()); }
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayKVExpression = children.get(0); if (!arrayKVExpression.evaluate(tuple, ptr)) { return false; } else if (ptr.getLength() == 0) { return true; } int length = PArrayDataType.getArrayLength(ptr, PDataType.fromTypeId(children.get(0).getDataType().getSqlType() - PDataType.ARRAY_TYPE_BASE), arrayKVExpression.getMaxLength()); boolean elementAvailable = false; for (int i = 0; i < length; i++) { Expression comparisonExpr = children.get(1); Expression arrayElemRef = ((ComparisonExpression)comparisonExpr).getChildren().get(1); ((ArrayElemRefExpression)arrayElemRef).setIndex(i + 1); comparisonExpr.evaluate(tuple, ptr); if (expectedReturnResult(resultFound(ptr))) { return result(); } elementAvailable = true; } if (!elementAvailable) { return false; } return true; } protected boolean resultFound(ImmutableBytesWritable ptr) {
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayKVExpression = children.get(0); if (!arrayKVExpression.evaluate(tuple, ptr)) { return false; } else if (ptr.getLength() == 0) { return true; } int length = PArrayDataType.getArrayLength(ptr, PDataType.fromTypeId(children.get(0).getDataType().getSqlType() - PDataType.ARRAY_TYPE_BASE), arrayKVExpression.getMaxLength()); boolean elementAvailable = false; for (int i = 0; i < length; i++) { Expression comparisonExpr = children.get(1); Expression arrayElemRef = ((ComparisonExpression)comparisonExpr).getChildren().get(1); ((ArrayElemRefExpression)arrayElemRef).setIndex(i + 1); comparisonExpr.evaluate(tuple, ptr); if (expectedReturnResult(resultFound(ptr))) { return result(); } elementAvailable = true; } if (!elementAvailable) { return false; } return true; } protected boolean resultFound(ImmutableBytesWritable ptr) {
@Override public Expression visitLeave(ArrayElemRefExpression node, List<Expression> l) { return isCloneNode(node, l) ? new ArrayElemRefExpression(l) : node; }
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayExpr = children.get(0); return PArrayDataTypeDecoder.positionAtArrayElement(tuple, ptr, index, arrayExpr, getDataType(), getMaxLength()); }
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayKVExpression = children.get(0); if (!arrayKVExpression.evaluate(tuple, ptr)) { return false; } else if (ptr.getLength() == 0) { return true; } int length = PArrayDataType.getArrayLength(ptr, PDataType.fromTypeId(children.get(0).getDataType().getSqlType() - PDataType.ARRAY_TYPE_BASE), arrayKVExpression.getMaxLength()); boolean elementAvailable = false; for (int i = 0; i < length; i++) { Expression comparisonExpr = children.get(1); Expression arrayElemRef = ((ComparisonExpression)comparisonExpr).getChildren().get(1); ((ArrayElemRefExpression)arrayElemRef).setIndex(i + 1); comparisonExpr.evaluate(tuple, ptr); if (expectedReturnResult(resultFound(ptr))) { return result(); } elementAvailable = true; } if (!elementAvailable) { return false; } return true; } protected boolean resultFound(ImmutableBytesWritable ptr) {
@Override public final <T> T accept(ExpressionVisitor<T> visitor) { List<T> l = acceptChildren(visitor, visitor.visitEnter(this)); T t = visitor.visitLeave(this, l); if (t == null) { t = visitor.defaultReturn(this, l); } return t; } }
@Override public Expression visitLeave(ArrayElemRefNode node, List<Expression> l) throws SQLException { return new ArrayElemRefExpression(l); }
@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { Expression arrayExpr = children.get(0); return PArrayDataTypeDecoder.positionAtArrayElement(tuple, ptr, index, arrayExpr, getDataType(), getMaxLength()); }
@Override public final <T> T accept(ExpressionVisitor<T> visitor) { List<T> l = acceptChildren(visitor, visitor.visitEnter(this)); T t = visitor.visitLeave(this, l); if (t == null) { t = visitor.defaultReturn(this, l); } return t; } }
@Override public Expression visitLeave(ArrayElemRefNode node, List<Expression> l) throws SQLException { return new ArrayElemRefExpression(l); }
@Override public Expression visitLeave(ArrayElemRefExpression node, List<Expression> l) { return isCloneNode(node, l) ? new ArrayElemRefExpression(l) : node; }
@Override public Expression visitLeave(ArrayElemRefExpression node, List<Expression> l) { return isCloneNode(node, l) ? new ArrayElemRefExpression(l) : node; }