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