public static Object evaluateFunction()

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;
  }