protected Object evaluate()

in core/src/main/java/com/jetbrains/youtrackdb/internal/core/sql/functions/coll/SQLFunctionTraversedElement.java [82:213]


  protected Object evaluate(
      final Object iThis,
      final Object[] iParams,
      final CommandContext iContext,
      final String iClassName) {
    final int beginIndex = (Integer) iParams[0];
    final var items = iParams.length > 1 ? (Integer) iParams[1] : 1;

    var stack = (Collection) iContext.getVariable("stack");
    if (stack == null && iThis instanceof ResultInternal resultInternal) {
      stack = (Collection) resultInternal.getMetadata("$stack");
    }
    if (stack == null) {
      throw new CommandExecutionException(iContext.getDatabaseSession(),
          "Cannot invoke " + getName(iContext.getDatabaseSession())
              + "() against non traverse command");
    }

    final List<Identifiable> result = items > 1 ? new ArrayList<Identifiable>(items) : null;

    var session = iContext.getDatabaseSession();
    if (beginIndex < 0) {
      var i = -1;
      for (final var o : stack) {
        if (o instanceof TraverseRecordProcess) {
          final var record = ((TraverseRecordProcess) o).getTarget();

          SchemaImmutableClass result1 = null;
          var transaction = session.getActiveTransaction();
          final EntityImpl entity = transaction.load(record);
          result1 = entity.getImmutableSchemaClass(session);
          if (iClassName == null
              || result1
              .isSubClassOf(iClassName)) {
            if (i <= beginIndex) {
              if (items == 1) {
                return record;
              } else {
                result.add(record);
                if (result.size() >= items) {
                  break;
                }
              }
            }
            i--;
          }
        } else if (o instanceof Identifiable record) {

          SchemaImmutableClass result1 = null;
          var transaction = session.getActiveTransaction();
          final EntityImpl entity = transaction.load(record);
          if (entity != null) {
            result1 = entity.getImmutableSchemaClass(session);
          }
          if (iClassName == null
              || result1
              .isSubClassOf(iClassName)) {
            if (i <= beginIndex) {
              if (items == 1) {
                return record;
              } else {
                result.add(record);
                if (result.size() >= items) {
                  break;
                }
              }
            }
            i--;
          }
        }
      }
    } else {
      var i = 0;
      var listStack = stackToList(stack);
      for (var x = listStack.size() - 1; x >= 0; x--) {
        final var o = listStack.get(x);
        if (o instanceof TraverseRecordProcess) {
          final var record = ((TraverseRecordProcess) o).getTarget();

          SchemaImmutableClass result1 = null;
          var transaction = session.getActiveTransaction();
          final EntityImpl entity = transaction.load(record);
          if (entity != null) {
            result1 = entity.getImmutableSchemaClass(session);
          }
          if (iClassName == null
              || result1
              .isSubClassOf(iClassName)) {
            if (i >= beginIndex) {
              if (items == 1) {
                return record;
              } else {
                result.add(record);
                if (result.size() >= items) {
                  break;
                }
              }
            }
            i++;
          }
        } else if (o instanceof Identifiable record) {

          SchemaImmutableClass result1 = null;
          var transaction = session.getActiveTransaction();
          final EntityImpl entity = transaction.load(record);
          if (entity != null) {
            result1 = entity.getImmutableSchemaClass(session);
          }
          if (iClassName == null
              || result1
              .isSubClassOf(iClassName)) {
            if (i >= beginIndex) {
              if (items == 1) {
                return record;
              } else {
                result.add(record);
                if (result.size() >= items) {
                  break;
                }
              }
            }
            i++;
          }
        }
      }
    }

    if (items > 0 && result != null && !result.isEmpty()) {
      return result;
    }
    return null;
  }