in core/src/main/java/com/jetbrains/youtrackdb/internal/core/record/impl/EntityHelper.java [861:1003]
public static Object evaluateFunction(
final Object currentValue, final String iFunction, final CommandContext iContext) {
if (currentValue == null) {
return null;
}
Object result = null;
final var function = iFunction.toUpperCase(Locale.ENGLISH);
if (function.startsWith("SIZE(")) {
result = currentValue instanceof DBRecord ? 1 : MultiValue.getSize(currentValue);
} else if (function.startsWith("LENGTH(")) {
result = currentValue.toString().length();
} else if (function.startsWith("TOUPPERCASE(")) {
result = currentValue.toString().toUpperCase(Locale.ENGLISH);
} else if (function.startsWith("TOLOWERCASE(")) {
result = currentValue.toString().toLowerCase(Locale.ENGLISH);
} else if (function.startsWith("TRIM(")) {
result = currentValue.toString().trim();
} else if (function.startsWith("TOJSON(")) {
result = currentValue instanceof EntityImpl ? ((EntityImpl) currentValue).toJSON() : null;
} else if (function.startsWith("KEYS(")) {
result = currentValue instanceof Map<?, ?> ? ((Map<?, ?>) currentValue).keySet() : null;
} else if (function.startsWith("VALUES(")) {
result = currentValue instanceof Map<?, ?> ? ((Map<?, ?>) currentValue).values() : null;
} else if (function.startsWith("ASSTRING(")) {
result = currentValue.toString();
} else if (function.startsWith("ASINTEGER(")) {
result = Integer.parseInt(currentValue.toString());
} else if (function.startsWith("ASFLOAT(")) {
result = Float.parseFloat(currentValue.toString());
} else if (function.startsWith("ASBOOLEAN(")) {
if (currentValue instanceof String) {
result = Boolean.parseBoolean((String) currentValue);
} else if (currentValue instanceof Number) {
final var bValue = ((Number) currentValue).intValue();
if (bValue == 0) {
result = Boolean.FALSE;
} else if (bValue == 1) {
result = Boolean.TRUE;
}
}
} else if (function.startsWith("ASDATE(")) {
if (currentValue instanceof Date) {
result = currentValue;
} else if (currentValue instanceof Number) {
result = new Date(((Number) currentValue).longValue());
} else {
try {
result =
DateHelper.getDateFormatInstance(iContext.getDatabaseSession())
.parse(currentValue.toString());
} catch (ParseException ignore) {
}
}
} else if (function.startsWith("ASDATETIME(")) {
if (currentValue instanceof Date) {
result = currentValue;
} else if (currentValue instanceof Number) {
result = new Date(((Number) currentValue).longValue());
} else {
try {
result =
DateHelper.getDateTimeFormatInstance(iContext.getDatabaseSession())
.parse(currentValue.toString());
} catch (ParseException ignore) {
}
}
} else {
// EXTRACT ARGUMENTS
final var args =
StringSerializerHelper.getParameters(iFunction.substring(iFunction.indexOf('(')));
final var currentRecord =
iContext != null ? (Entity) iContext.getVariable("$current") : null;
for (var i = 0; i < args.size(); ++i) {
final var arg = args.get(i);
final var o = SQLHelper.getValue(arg, currentRecord, iContext);
if (o != null) {
args.set(i, o.toString());
}
}
if (function.startsWith("CHARAT(")) {
result = currentValue.toString().charAt(Integer.parseInt(args.getFirst()));
} else if (function.startsWith("INDEXOF(")) {
if (args.size() == 1) {
result = currentValue.toString().indexOf(IOUtils.getStringContent(args.getFirst()));
} else {
result =
currentValue
.toString()
.indexOf(IOUtils.getStringContent(args.get(0)), Integer.parseInt(args.get(1)));
}
} else if (function.startsWith("SUBSTRING(")) {
if (args.size() == 1) {
result = currentValue.toString().substring(Integer.parseInt(args.getFirst()));
} else {
result =
currentValue
.toString()
.substring(Integer.parseInt(args.get(0)), Integer.parseInt(args.get(1)));
}
} else if (function.startsWith("APPEND(")) {
result = currentValue + IOUtils.getStringContent(args.getFirst());
} else if (function.startsWith("PREFIX(")) {
result = IOUtils.getStringContent(args.getFirst()) + currentValue;
} else if (function.startsWith("FORMAT(")) {
if (currentValue instanceof Date) {
var formatter = new SimpleDateFormat(
IOUtils.getStringContent(args.getFirst()));
formatter.setTimeZone(DateHelper.getDatabaseTimeZone(iContext.getDatabaseSession()));
result = formatter.format(currentValue);
} else {
result = String.format(IOUtils.getStringContent(args.getFirst()), currentValue);
}
} else if (function.startsWith("LEFT(")) {
final var len = Integer.parseInt(args.getFirst());
final var stringValue = currentValue.toString();
result = stringValue.substring(0, Math.min(len, stringValue.length()));
} else if (function.startsWith("RIGHT(")) {
final var offset = Integer.parseInt(args.getFirst());
final var stringValue = currentValue.toString();
result =
stringValue.substring(
offset < stringValue.length() ? stringValue.length() - offset : 0);
} else {
final var f = SQLHelper.getFunction(iContext.getDatabaseSession(), null,
iFunction);
if (f != null) {
if (currentRecord instanceof Entity entity) {
result = f.execute(currentRecord, entity, null, iContext);
} else {
throw new DatabaseExportException("Cannot execute function " + iFunction
+ " because the current record is not an entity");
}
}
}
}
return result;
}