use of org.apache.asterix.om.base.AOrderedList in project asterixdb by apache.
the class FieldAccessNestedResultType method getResultType.
@Override
protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
IAType firstArgType = strippedInputTypes[0];
if (firstArgType.getTypeTag() != ATypeTag.OBJECT) {
return BuiltinType.ANY;
}
AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
ILogicalExpression arg1 = funcExpr.getArguments().get(1).getValue();
if (arg1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
return BuiltinType.ANY;
}
ConstantExpression ce = (ConstantExpression) arg1;
IAObject v = ((AsterixConstantValue) ce.getValue()).getObject();
List<String> fieldPath = new ArrayList<>();
if (v.getType().getTypeTag() == ATypeTag.ARRAY) {
for (int i = 0; i < ((AOrderedList) v).size(); i++) {
fieldPath.add(((AString) ((AOrderedList) v).getItem(i)).getStringValue());
}
} else {
fieldPath.add(((AString) v).getStringValue());
}
ARecordType recType = (ARecordType) firstArgType;
IAType fieldType = recType.getSubFieldType(fieldPath);
return fieldType == null ? BuiltinType.ANY : fieldType;
}
use of org.apache.asterix.om.base.AOrderedList in project asterixdb by apache.
the class NonTaggedDataFormat method registerTypeInferers.
void registerTypeInferers() {
functionTypeInferers.put(BuiltinFunctions.LISTIFY, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
fd.setImmutableStates(context.getType(expr));
}
});
functionTypeInferers.put(BuiltinFunctions.RECORD_MERGE, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
IAType outType = (IAType) context.getType(expr);
IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
IAType type1 = (IAType) context.getType(f.getArguments().get(1).getValue());
fd.setImmutableStates(outType, type0, type1);
}
});
functionTypeInferers.put(BuiltinFunctions.DEEP_EQUAL, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
IAType type1 = (IAType) context.getType(f.getArguments().get(1).getValue());
fd.setImmutableStates(type0, type1);
}
});
functionTypeInferers.put(BuiltinFunctions.ADD_FIELDS, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
IAType outType = (IAType) context.getType(expr);
IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
ILogicalExpression listExpr = f.getArguments().get(1).getValue();
IAType type1 = (IAType) context.getType(listExpr);
if (type0.getTypeTag().equals(ATypeTag.ANY)) {
type0 = DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
}
if (type1.getTypeTag().equals(ATypeTag.ANY)) {
type1 = DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE;
}
fd.setImmutableStates(outType, type0, type1);
}
});
functionTypeInferers.put(BuiltinFunctions.REMOVE_FIELDS, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
IAType outType = (IAType) context.getType(expr);
IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
ILogicalExpression le = f.getArguments().get(1).getValue();
IAType type1 = (IAType) context.getType(le);
if (type0.getTypeTag().equals(ATypeTag.ANY)) {
type0 = DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
}
if (type1.getTypeTag().equals(ATypeTag.ANY)) {
type1 = DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE;
}
fd.setImmutableStates(outType, type0, type1);
}
});
functionTypeInferers.put(BuiltinFunctions.CAST_TYPE, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
IAType rt = TypeCastUtils.getRequiredType(funcExpr);
IAType it = (IAType) context.getType(funcExpr.getArguments().get(0).getValue());
fd.setImmutableStates(rt, it);
}
});
functionTypeInferers.put(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
ARecordType rt = (ARecordType) context.getType(expr);
fd.setImmutableStates(rt, computeOpenFields((AbstractFunctionCallExpression) expr, rt));
}
private boolean[] computeOpenFields(AbstractFunctionCallExpression expr, ARecordType recType) {
int n = expr.getArguments().size() / 2;
boolean[] open = new boolean[n];
for (int i = 0; i < n; i++) {
Mutable<ILogicalExpression> argRef = expr.getArguments().get(2 * i);
ILogicalExpression arg = argRef.getValue();
open[i] = true;
final String fn = ConstantExpressionUtil.getStringConstant(arg);
if (fn != null) {
for (String s : recType.getFieldNames()) {
if (s.equals(fn)) {
open[i] = false;
break;
}
}
}
}
return open;
}
});
functionTypeInferers.put(BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
fd.setImmutableStates(context.getType(expr));
}
});
functionTypeInferers.put(BuiltinFunctions.ORDERED_LIST_CONSTRUCTOR, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
fd.setImmutableStates(context.getType(expr));
}
});
functionTypeInferers.put(BuiltinFunctions.UNORDERED_LIST_CONSTRUCTOR, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
fd.setImmutableStates(context.getType(expr));
}
});
functionTypeInferers.put(BuiltinFunctions.FIELD_ACCESS_BY_INDEX, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
switch(t.getTypeTag()) {
case OBJECT:
{
fd.setImmutableStates(t);
break;
}
case UNION:
{
AUnionType unionT = (AUnionType) t;
if (unionT.isUnknownableType()) {
IAType t2 = unionT.getActualType();
if (t2.getTypeTag() == ATypeTag.OBJECT) {
fd.setImmutableStates(t2);
break;
}
}
throw new NotImplementedException("field-access-by-index for data of type " + t);
}
default:
{
throw new NotImplementedException("field-access-by-index for data of type " + t);
}
}
}
});
functionTypeInferers.put(BuiltinFunctions.FIELD_ACCESS_NESTED, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
AOrderedList fieldPath = (AOrderedList) (((AsterixConstantValue) ((ConstantExpression) fce.getArguments().get(1).getValue()).getValue()).getObject());
List<String> listFieldPath = new ArrayList<String>();
for (int i = 0; i < fieldPath.size(); i++) {
listFieldPath.add(((AString) fieldPath.getItem(i)).getStringValue());
}
switch(t.getTypeTag()) {
case OBJECT:
{
fd.setImmutableStates(t, listFieldPath);
break;
}
case ANY:
fd.setImmutableStates(RecordUtil.FULLY_OPEN_RECORD_TYPE, listFieldPath);
break;
default:
{
throw new NotImplementedException("field-access-nested for data of type " + t);
}
}
}
});
functionTypeInferers.put(BuiltinFunctions.GET_RECORD_FIELDS, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
ATypeTag typeTag = t.getTypeTag();
if (typeTag.equals(ATypeTag.OBJECT)) {
fd.setImmutableStates(t);
} else if (typeTag.equals(ATypeTag.ANY)) {
fd.setImmutableStates(RecordUtil.FULLY_OPEN_RECORD_TYPE);
} else {
throw new NotImplementedException("get-record-fields for data of type " + t);
}
}
});
functionTypeInferers.put(BuiltinFunctions.GET_RECORD_FIELD_VALUE, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
ATypeTag typeTag = t.getTypeTag();
if (typeTag.equals(ATypeTag.OBJECT)) {
fd.setImmutableStates(t);
} else if (typeTag.equals(ATypeTag.ANY)) {
fd.setImmutableStates(RecordUtil.FULLY_OPEN_RECORD_TYPE);
} else {
throw new NotImplementedException("get-record-field-value for data of type " + t);
}
}
});
functionTypeInferers.put(BuiltinFunctions.RECORD_PAIRS, new FunctionTypeInferer() {
@Override
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context) throws AlgebricksException {
AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
ATypeTag typeTag = t.getTypeTag();
if (typeTag.equals(ATypeTag.OBJECT)) {
fd.setImmutableStates(t);
} else if (typeTag.equals(ATypeTag.ANY)) {
fd.setImmutableStates(RecordUtil.FULLY_OPEN_RECORD_TYPE);
} else {
throw new NotImplementedException("record-fields with data of type " + t);
}
}
});
}
use of org.apache.asterix.om.base.AOrderedList in project asterixdb by apache.
the class NonTaggedDataFormat method getFieldAccessEvaluatorFactory.
@SuppressWarnings("unchecked")
@Override
public IScalarEvaluatorFactory getFieldAccessEvaluatorFactory(ARecordType recType, List<String> fldName, int recordColumn) throws AlgebricksException {
String[] names = recType.getFieldNames();
int n = names.length;
boolean fieldFound = false;
IScalarEvaluatorFactory recordEvalFactory = new ColumnAccessEvalFactory(recordColumn);
ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
DataOutput dos = abvs.getDataOutput();
IScalarEvaluatorFactory evalFactory = null;
if (fldName.size() == 1) {
for (int i = 0; i < n; i++) {
if (names[i].equals(fldName.get(0))) {
fieldFound = true;
try {
AInt32 ai = new AInt32(i);
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(ai.getType()).serialize(ai, dos);
} catch (HyracksDataException e) {
throw new AlgebricksException(e);
}
IScalarEvaluatorFactory fldIndexEvalFactory = new ConstantEvalFactory(Arrays.copyOf(abvs.getByteArray(), abvs.getLength()));
evalFactory = new FieldAccessByIndexEvalFactory(recordEvalFactory, fldIndexEvalFactory, recType);
return evalFactory;
}
}
}
if (fldName.size() > 1 || (!fieldFound && recType.isOpen())) {
if (fldName.size() == 1) {
AString as = new AString(fldName.get(0));
try {
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(as.getType()).serialize(as, dos);
} catch (HyracksDataException e) {
throw new AlgebricksException(e);
}
} else {
AOrderedList as = new AOrderedList(fldName);
try {
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(as.getType()).serialize(as, dos);
} catch (HyracksDataException e) {
throw new AlgebricksException(e);
}
}
IScalarEvaluatorFactory[] factories = new IScalarEvaluatorFactory[2];
factories[0] = recordEvalFactory;
if (fldName.size() > 1) {
evalFactory = new FieldAccessNestedEvalFactory(recordEvalFactory, recType, fldName);
} else {
evalFactory = FieldAccessByNameDescriptor.FACTORY.createFunctionDescriptor().createEvaluatorFactory(factories);
}
return evalFactory;
} else {
throw new AlgebricksException("Could not find field " + fldName + " in the schema.");
}
}
use of org.apache.asterix.om.base.AOrderedList in project asterixdb by apache.
the class AOrderedListSerializerDeserializerTest method test.
@Test
public void test() {
// Generates types.
ARecordType addrRecordType = SerializerDeserializerTestUtils.generateAddressRecordType();
ARecordType employeeType = SerializerDeserializerTestUtils.generateEmployeeRecordType(addrRecordType);
AOrderedListType employeeListType = new AOrderedListType(employeeType, "employee_list");
//Generates records.
ARecord[] records = SerializerDeserializerTestUtils.generateRecords(addrRecordType, employeeType);
// Generates lists
AOrderedList[] lists = new AOrderedList[4];
for (int index = 0; index < lists.length; ++index) {
lists[index] = new AOrderedList(employeeListType, Arrays.asList(records));
}
AOrderedListSerializerDeserializer serde = new AOrderedListSerializerDeserializer(employeeListType);
// Run four test threads to serialize/deserialize lists concurrently.
SerializerDeserializerTestUtils.concurrentSerDeTestRun(serde, lists);
}
use of org.apache.asterix.om.base.AOrderedList in project asterixdb by apache.
the class SerializerDeserializerTestUtils method generateRecords.
public static ARecord[] generateRecords(ARecordType addrRecordType, ARecordType employeeType) {
AOrderedListType addrListType = new AOrderedListType(addrRecordType, "address_history");
ARecord addr11 = new ARecord(addrRecordType, new IAObject[] { new AString("120 San Raman Street"), new AString("Irvine"), new AString("CA"), new AInt16((short) 95051), new AInterval(0, 100, (byte) 0) });
ARecord addr12 = new ARecord(addrRecordType, new IAObject[] { new AString("210 University Drive"), new AString("Philadelphia"), new AString("PA"), new AInt16((short) 10086), new AInterval(100, 300, (byte) 0) });
ARecord addr21 = new ARecord(addrRecordType, new IAObject[] { new AString("1 College Street"), new AString("Seattle"), new AString("WA"), new AInt16((short) 20012), new AInterval(400, 500, (byte) 0) });
ARecord addr22 = new ARecord(addrRecordType, new IAObject[] { new AString("20 Lindsay Avenue"), new AString("Columbus"), new AString("OH"), new AInt16((short) 30120), new AInterval(600, 900, (byte) 0) });
ARecord addr31 = new ARecord(addrRecordType, new IAObject[] { new AString("200 14th Avenue"), new AString("Long Island"), new AString("NY"), new AInt16((short) 95011), new AInterval(12000, 14000, (byte) 0) });
// With nested open field addr31.
ARecord addr32 = new ARecord(addrRecordType, new IAObject[] { new AString("51 8th Street"), new AString("Orlando"), new AString("FL"), new AInt16((short) 49045), new AInterval(190000, 200000, (byte) 0) });
ARecord record1 = new ARecord(employeeType, new IAObject[] { new AInt64(0L), new AString("Tom"), new AOrderedList(addrListType, Arrays.asList(new IAObject[] { addr11, addr12 })) });
ARecord record2 = new ARecord(employeeType, new IAObject[] { new AInt64(1L), new AString("John"), new AOrderedList(addrListType, Arrays.asList(new IAObject[] { addr21, addr22 })) });
ARecord record3 = new ARecord(employeeType, new IAObject[] { new AInt64(2L), new AString("Lindsay"), new AOrderedList(addrListType, Arrays.asList(new IAObject[] { addr31, addr32 })) });
// With nested open field addr41.
ARecord record4 = new ARecord(employeeType, new IAObject[] { new AInt64(3L), new AString("Joshua"), new AOrderedList(addrListType, Arrays.asList(new IAObject[] {})) });
ARecord[] records = new ARecord[] { record1, record2, record3, record4 };
return records;
}
Aggregations