use of org.apache.asterix.external.classad.Value in project asterixdb by apache.
the class ClassAdParser method evaluateFunction.
public ExprTree evaluateFunction(String functionName, ExprList argList) throws HyracksDataException {
Value val = objectPool.valuePool.get();
AMutableNumberFactor factor = objectPool.numFactorPool.get();
ExprTreeHolder tree = objectPool.mutableExprPool.get();
((Literal) argList.get(0)).getComponents(val, factor);
AMutableCharArrayString string_value = objectPool.strPool.get();
if (val.isStringValue(string_value)) {
if (functionName.equalsIgnoreCase("absTime")) {
tree.setInnerTree(Literal.createAbsTime(string_value, objectPool));
} else if (functionName.equalsIgnoreCase("relTime")) {
tree.setInnerTree(Literal.createRelTime(string_value, objectPool));
} else {
tree.setInnerTree(FunctionCall.createFunctionCall(functionName, argList, objectPool));
}
} else {
tree.setInnerTree(FunctionCall.createFunctionCall(functionName, argList, objectPool));
}
return tree;
}
use of org.apache.asterix.external.classad.Value in project asterixdb by apache.
the class ClassAdParser method writeFieldValueToBuffer.
private void writeFieldValueToBuffer(IAType fieldType, DataOutput out, String name, ExprTree tree, ClassAd pAd) throws IOException, AsterixException {
Value val;
switch(tree.getKind()) {
case ATTRREF_NODE:
case CLASSAD_NODE:
case EXPR_ENVELOPE:
case EXPR_LIST_NODE:
case FN_CALL_NODE:
case OP_NODE:
val = objectPool.valuePool.get();
if (pAd.evaluateAttr(name, val)) {
} else {
// just write the expr
val = ((Literal) pAd.getAttrList().get(name + "Expr")).getValue();
}
break;
case LITERAL_NODE:
val = ((Literal) tree.getTree()).getValue();
break;
default:
throw new HyracksDataException("Unknown Expression type detected: " + tree.getKind());
}
if (fieldType != null) {
if (NonTaggedFormatUtil.isOptional(fieldType)) {
fieldType = ((AUnionType) fieldType).getActualType();
}
}
switch(val.getValueType()) {
case ABSOLUTE_TIME_VALUE:
if (checkType(ATypeTag.DATETIME, fieldType)) {
parseDateTime(val, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case BOOLEAN_VALUE:
if (checkType(ATypeTag.BOOLEAN, fieldType)) {
booleanSerde.serialize(val.getBoolVal() ? ABoolean.TRUE : ABoolean.FALSE, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case CLASSAD_VALUE:
if (checkType(ATypeTag.OBJECT, fieldType)) {
IAType objectType = getComplexType(fieldType, ATypeTag.OBJECT);
ClassAd classad = val.getClassadVal();
parseRecord((ARecordType) objectType, classad, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case ERROR_VALUE:
case STRING_VALUE:
case UNDEFINED_VALUE:
if (checkType(ATypeTag.STRING, fieldType)) {
parseString(val, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case INTEGER_VALUE:
if (checkType(ATypeTag.BIGINT, fieldType)) {
if (fieldType == null || fieldType.getTypeTag() == ATypeTag.BIGINT) {
aInt64.setValue(val.getLongVal());
int64Serde.serialize(aInt64, out);
} else if (fieldType.getTypeTag() == ATypeTag.INTEGER) {
aInt32.setValue((int) val.getLongVal());
int32Serde.serialize(aInt32, out);
} else if (fieldType.getTypeTag() == ATypeTag.DOUBLE) {
aDouble.setValue(val.getLongVal());
doubleSerde.serialize(aDouble, out);
} else if (fieldType.getTypeTag() == ATypeTag.SMALLINT) {
aInt16.setValue((short) val.getLongVal());
int16Serde.serialize(aInt16, out);
} else if (fieldType.getTypeTag() == ATypeTag.TINYINT) {
aInt8.setValue((byte) val.getLongVal());
int8Serde.serialize(aInt8, out);
} else if (fieldType.getTypeTag() == ATypeTag.FLOAT) {
aFloat.setValue(val.getLongVal());
floatSerde.serialize(aFloat, out);
}
} else if (checkType(ATypeTag.DATETIME, fieldType)) {
// Classad uses Linux Timestamps (s instead of ms)
aDateTime.setValue(val.getLongVal() * 1000);
datetimeSerde.serialize(aDateTime, out);
} else if (checkType(ATypeTag.DURATION, fieldType)) {
// Classad uses Linux Timestamps (s instead of ms)
aDuration.setValue(0, val.getLongVal() * 1000);
durationSerde.serialize(aDuration, out);
} else if (checkType(ATypeTag.INTEGER, fieldType)) {
aInt32.setValue((int) val.getLongVal());
int32Serde.serialize(aInt32, out);
} else if (checkType(ATypeTag.DOUBLE, fieldType)) {
aDouble.setValue(val.getLongVal());
doubleSerde.serialize(aDouble, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case LIST_VALUE:
case SLIST_VALUE:
IAType objectType;
if (checkType(ATypeTag.MULTISET, fieldType)) {
objectType = getComplexType(fieldType, ATypeTag.MULTISET);
parseUnorderedList((AUnorderedListType) objectType, val, out);
} else if (checkType(ATypeTag.ARRAY, fieldType)) {
objectType = getComplexType(fieldType, ATypeTag.ARRAY);
parseOrderedList((AOrderedListType) objectType, val, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case REAL_VALUE:
if (checkType(ATypeTag.DOUBLE, fieldType)) {
if (fieldType == null || fieldType.getTypeTag() == ATypeTag.DOUBLE) {
aDouble.setValue(val.getDoubleVal());
doubleSerde.serialize(aDouble, out);
} else if (fieldType.getTypeTag() == ATypeTag.INTEGER) {
aInt32.setValue((int) val.getDoubleVal());
int32Serde.serialize(aInt32, out);
} else if (fieldType.getTypeTag() == ATypeTag.BIGINT) {
aInt64.setValue((long) val.getDoubleVal());
int64Serde.serialize(aInt64, out);
} else if (fieldType.getTypeTag() == ATypeTag.SMALLINT) {
aInt16.setValue((short) val.getDoubleVal());
int16Serde.serialize(aInt16, out);
} else if (fieldType.getTypeTag() == ATypeTag.TINYINT) {
aInt8.setValue((byte) val.getDoubleVal());
int8Serde.serialize(aInt8, out);
} else if (fieldType.getTypeTag() == ATypeTag.FLOAT) {
aFloat.setValue((float) val.getDoubleVal());
floatSerde.serialize(aFloat, out);
}
} else if (checkType(ATypeTag.INTEGER, fieldType)) {
aInt32.setValue((int) val.getDoubleVal());
int32Serde.serialize(aInt32, out);
} else if (checkType(ATypeTag.BIGINT, fieldType)) {
aInt64.setValue((long) val.getDoubleVal());
int64Serde.serialize(aInt64, out);
} else if (checkType(ATypeTag.DATETIME, fieldType)) {
// Classad uses Linux Timestamps (s instead of ms)
aDateTime.setValue(val.getLongVal() * 1000);
datetimeSerde.serialize(aDateTime, out);
} else if (checkType(ATypeTag.DURATION, fieldType)) {
// Classad uses Linux Timestamps (s instead of ms)
aDuration.setValue(0, (long) (val.getDoubleVal() * 1000.0));
durationSerde.serialize(aDuration, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
case RELATIVE_TIME_VALUE:
if (checkType(ATypeTag.DURATION, fieldType)) {
parseDuration(val, out);
} else {
throw new HyracksDataException(mismatchErrorMessage + fieldType.getTypeTag());
}
break;
default:
throw new HyracksDataException("unknown data type " + val.getValueType());
}
}
use of org.apache.asterix.external.classad.Value in project asterixdb by apache.
the class ClassAdParser method shouldEvaluateAtParseTime.
public boolean shouldEvaluateAtParseTime(String functionName, ExprList argList) throws HyracksDataException {
boolean should_eval = false;
if (functionName.equalsIgnoreCase("absTime") || functionName.equalsIgnoreCase("relTime")) {
if (argList.size() == 1 && argList.get(0).getKind() == NodeKind.LITERAL_NODE) {
Value val = objectPool.valuePool.get();
AMutableNumberFactor factor = objectPool.numFactorPool.get();
((Literal) argList.get(0)).getComponents(val, factor);
if (val.isStringValue()) {
should_eval = true;
}
}
}
return should_eval;
}
use of org.apache.asterix.external.classad.Value in project asterixdb by apache.
the class FunctionalTester method handle_eval.
/*********************************************************************
* Function: handle_eval
* Purpose:
*
* @throws IOException
*********************************************************************/
public static void handle_eval(AMutableString line, State state, Parameters parameters, ClassAdObjectPool objectPool) throws IOException {
AMutableString variable_name = new AMutableString("");
ExprTree tree;
Variable variable;
if (get_variable_name(line, true, variable_name, state, parameters)) {
tree = get_expr(line, state, parameters, objectPool);
if (tree != null) {
Value value = new Value(objectPool);
if (!evaluate_expr(tree, value, parameters, objectPool)) {
print_error_message("Couldn't evaluate rvalue", state);
} else {
variable = new Variable(variable_name.getStringValue(), value);
variables.put(variable_name.getStringValue(), variable);
}
}
}
return;
}
use of org.apache.asterix.external.classad.Value in project asterixdb by apache.
the class FunctionalTester method handle_diff.
/*********************************************************************
* Function: handle_diff
* Purpose:
*
* @throws IOException
*********************************************************************/
public static void handle_diff(AMutableString line, State state, Parameters parameters, ClassAdObjectPool objectPool) throws IOException {
ExprTreeHolder tree = new ExprTreeHolder(objectPool);
ExprTreeHolder tree2 = new ExprTreeHolder(objectPool);
Value value1 = new Value(objectPool);
Value value2 = new Value(objectPool);
get_two_exprs(line, tree, tree2, state, parameters, objectPool);
if (tree.getInnerTree() != null || tree2.getInnerTree() != null) {
if (!evaluate_expr(tree, value1, parameters, objectPool)) {
print_error_message("Couldn't evaluate first expression.\n", state);
} else if (!evaluate_expr(tree2, value2, parameters, objectPool)) {
print_error_message("Couldn't evaluate second expressions.\n", state);
} else if (value1.sameAs(value2)) {
print_error_message("the expressions are the same.", state);
assert (false);
}
}
return;
}
Aggregations