private boolean isMatched(IAType type1, IAType type2, boolean useListDomain) throws AlgebricksException { // Sanity check - two types can't be NULL in order to be matched. if (type1 == null || type2 == null) { return false; } if (ATypeHierarchy.isSameTypeDomain(Index.getNonNullableType(type1).first.getTypeTag(), Index.getNonNullableType(type2).first.getTypeTag(), useListDomain)) { return true; } return ATypeHierarchy.canPromote(Index.getNonNullableType(type1).first.getTypeTag(), Index.getNonNullableType(type2).first.getTypeTag()); }
public static Pair<IAType, Boolean> getNonNullableKeyFieldType(List<String> expr, ARecordType recType) throws AlgebricksException { IAType keyType = Index.keyFieldType(expr, recType); Pair<IAType, Boolean> pair = getNonNullableType(keyType); pair.second = pair.second || recType.isSubFieldNullable(expr); return pair; }
public static Pair<IAType, Boolean> getNonNullableOpenFieldType(IAType fieldType, List<String> fieldName, ARecordType recType) throws AlgebricksException { Pair<IAType, Boolean> keyPairType = null; IAType subType = recType; boolean nullable = false; for (int i = 0; i < fieldName.size(); i++) { if (subType instanceof AUnionType) { nullable = nullable || ((AUnionType) subType).isUnknownableType(); subType = ((AUnionType) subType).getActualType(); } if (subType instanceof ARecordType) { subType = ((ARecordType) subType).getFieldType(fieldName.get(i)); } else { throw AsterixException.create(ErrorCode.COMPILATION_ILLEGAL_STATE, "Unexpected type " + fieldType); } if (subType == null) { keyPairType = Index.getNonNullableType(fieldType); break; } } if (subType != null) { keyPairType = Index.getNonNullableKeyFieldType(fieldName, recType); } keyPairType.second = keyPairType.second || nullable; return keyPairType; }