use of org.apache.ignite.internal.processors.query.QueryUtils.VAL_FIELD_NAME in project ignite by apache.
the class QueryTypeDescriptorImpl method validateIndexes.
/**
* Validate indexed values.
*/
private void validateIndexes(Object key, Object val) throws IgniteCheckedException {
if (F.isEmpty(idxs))
return;
for (QueryIndexDescriptorImpl idx : idxs.values()) {
for (String idxField : idx.fields()) {
GridQueryProperty prop = props.get(idxField);
Object propVal;
Class<?> propType;
if (F.eq(idxField, keyFieldAlias()) || F.eq(idxField, KEY_FIELD_NAME)) {
propVal = key instanceof KeyCacheObject ? ((CacheObject) key).value(coCtx, true) : key;
propType = propVal == null ? null : propVal.getClass();
} else if (F.eq(idxField, valueFieldAlias()) || F.eq(idxField, VAL_FIELD_NAME)) {
propVal = val instanceof CacheObject ? ((CacheObject) val).value(coCtx, true) : val;
propType = propVal == null ? null : propVal.getClass();
} else {
propVal = prop.value(key, val);
propType = prop.type();
}
if (propVal == null)
continue;
if (!(propVal instanceof BinaryObject) || propVal instanceof BinaryArray) {
if (!U.box(propType).isAssignableFrom(U.box(propVal.getClass()))) {
// Some reference type arrays end up being converted to Object[]
if (!(propType.isArray() && BinaryUtils.isObjectArray(propVal.getClass()) && Arrays.stream(BinaryUtils.rawArrayFromBinary(propVal)).noneMatch(x -> x != null && !U.box(propType.getComponentType()).isAssignableFrom(U.box(x.getClass()))))) {
throw new IgniteSQLException("Type for a column '" + idxField + "' is not compatible with index definition. Expected '" + propType.getSimpleName() + "', actual type '" + propVal.getClass().getSimpleName() + "'");
}
}
} else if (coCtx.kernalContext().cacheObjects().typeId(propType.getName()) != ((BinaryObject) propVal).type().typeId()) {
// Check for classes/enums implementing indexed interfaces.
final Class<?> cls = U.classForName(((BinaryObject) propVal).type().typeName(), null, true);
if ((cls == null && propType == Object.class) || (cls != null && propType.isAssignableFrom(cls)))
continue;
throw new IgniteSQLException("Type for a column '" + idxField + "' is not compatible with index definition. Expected '" + propType.getSimpleName() + "', actual type '" + ((BinaryObject) propVal).type().typeName() + "'");
}
}
}
}
use of org.apache.ignite.internal.processors.query.QueryUtils.VAL_FIELD_NAME in project ignite by apache.
the class QueryTypeDescriptorImpl method validateProps.
/**
* Validate properties.
*/
private void validateProps(Object key, Object val) throws IgniteCheckedException {
if (F.isEmpty(validateProps))
return;
final boolean validateTypes = coCtx.kernalContext().config().getSqlConfiguration().isValidationEnabled();
for (int i = 0; i < validateProps.size(); ++i) {
GridQueryProperty prop = validateProps.get(i);
Object propVal;
boolean isKey = false;
if (F.eq(prop.name(), keyFieldAlias()) || (keyFieldName == null && F.eq(prop.name(), KEY_FIELD_NAME))) {
propVal = key instanceof KeyCacheObject ? ((CacheObject) key).value(coCtx, true) : key;
isKey = true;
} else if (F.eq(prop.name(), valueFieldAlias()) || (valFieldName == null && F.eq(prop.name(), VAL_FIELD_NAME)))
propVal = val instanceof CacheObject ? ((CacheObject) val).value(coCtx, true) : val;
else
propVal = prop.value(key, val);
if (propVal == null && prop.notNull()) {
throw new IgniteSQLException("Null value is not allowed for column '" + prop.name() + "'", isKey ? NULL_KEY : NULL_VALUE);
}
if (validateTypes && propVal != null) {
if (!(propVal instanceof BinaryObject) || propVal instanceof BinaryArray) {
if (!U.box(prop.type()).isAssignableFrom(U.box(propVal.getClass()))) {
// Some reference type arrays end up being converted to Object[]
if (!(prop.type().isArray() && BinaryUtils.isObjectArray(propVal.getClass()) && Arrays.stream(BinaryUtils.rawArrayFromBinary(propVal)).noneMatch(x -> x != null && !U.box(prop.type().getComponentType()).isAssignableFrom(U.box(x.getClass()))))) {
throw new IgniteSQLException("Type for a column '" + prop.name() + "' is not compatible with table definition. Expected '" + prop.type().getSimpleName() + "', actual type '" + propVal.getClass().getSimpleName() + "'");
}
}
} else if (coCtx.kernalContext().cacheObjects().typeId(prop.type().getName()) != ((BinaryObject) propVal).type().typeId()) {
throw new IgniteSQLException("Type for a column '" + prop.name() + "' is not compatible with table definition. Expected '" + prop.type().getSimpleName() + "', actual type '" + ((BinaryObject) propVal).type().typeName() + "'");
}
}
if (propVal == null || prop.precision() == -1)
continue;
if (String.class == propVal.getClass() || byte[].class == propVal.getClass()) {
int propValLen = String.class == propVal.getClass() ? ((String) propVal).length() : ((byte[]) propVal).length;
if (propValLen > prop.precision()) {
throw new IgniteSQLException("Value for a column '" + prop.name() + "' is too long. " + "Maximum length: " + prop.precision() + ", actual length: " + propValLen, isKey ? TOO_LONG_KEY : TOO_LONG_VALUE);
}
} else if (BigDecimal.class == propVal.getClass()) {
BigDecimal dec = (BigDecimal) propVal;
if (dec.precision() > prop.precision()) {
throw new IgniteSQLException("Value for a column '" + prop.name() + "' is out of range. " + "Maximum precision: " + prop.precision() + ", actual precision: " + dec.precision(), isKey ? TOO_LONG_KEY : TOO_LONG_VALUE);
} else if (prop.scale() != -1 && dec.scale() > prop.scale()) {
throw new IgniteSQLException("Value for a column '" + prop.name() + "' is out of range. " + "Maximum scale : " + prop.scale() + ", actual scale: " + dec.scale(), isKey ? KEY_SCALE_OUT_OF_RANGE : VALUE_SCALE_OUT_OF_RANGE);
}
}
}
}
Aggregations