public Object evaluate()

in core/src/main/java/com/jetbrains/youtrackdb/internal/core/sql/filter/SQLFilterCondition.java [81:203]


  public Object evaluate(
      final Result iCurrentRecord,
      final EntityImpl iCurrentResult,
      final CommandContext iContext) {
    var session = iContext.getDatabaseSession();
    var binaryEvaluation =
        operator != null && operator.isSupportingBinaryEvaluate()
            && session.getSerializer().getSupportBinaryEvaluate()
            && iCurrentRecord != null && iCurrentRecord.isEntity()
            && iCurrentRecord.getIdentity().isPersistent();

    var l = evaluate(iCurrentRecord, iCurrentResult, left, iContext, binaryEvaluation);

    if (operator == null || operator.canShortCircuit(l)) {
      return l;
    }

    var r = evaluate(iCurrentRecord, iCurrentResult, right, iContext, binaryEvaluation);
    var schema = session.getMetadata().getImmutableSchemaSnapshot();

    if (binaryEvaluation && l instanceof BinaryField) {
      if (r != null && !(r instanceof BinaryField)) {
        final var type = PropertyTypeInternal.getTypeByValue(r);

        if (RecordSerializerBinary.INSTANCE
            .getCurrentSerializer()
            .getComparator()
            .isBinaryComparable(type)) {
          final var bytes = new BytesContainer();
          RecordSerializerBinary.INSTANCE
              .getCurrentSerializer()
              .serializeValue(session, bytes, r, type, null, schema, null);
          bytes.offset = 0;
          final var collate =
              r instanceof SQLFilterItemField
                  ? ((SQLFilterItemField) r).getCollate(session, iCurrentRecord)
                  : null;
          r = new BinaryField(null, type, bytes, collate);
          if (!(right instanceof SQLFilterItem || right instanceof SQLFilterCondition))
          // FIXED VALUE, REPLACE IT
          {
            right = r;
          }
        }
      } else if (r instanceof BinaryField)
      // GET THE COPY OR MT REASONS
      {
        r = ((BinaryField) r).copy();
      }
    }

    if (binaryEvaluation && r instanceof BinaryField) {
      if (l != null && !(l instanceof BinaryField)) {
        final var type = PropertyTypeInternal.getTypeByValue(l);
        if (RecordSerializerBinary.INSTANCE
            .getCurrentSerializer()
            .getComparator()
            .isBinaryComparable(type)) {
          final var bytes = new BytesContainer();
          RecordSerializerBinary.INSTANCE
              .getCurrentSerializer()
              .serializeValue(session, bytes, l, type, null, schema, null);
          bytes.offset = 0;
          final var collate =
              l instanceof SQLFilterItemField
                  ? ((SQLFilterItemField) l).getCollate(session, iCurrentRecord)
                  : null;
          l = new BinaryField(null, type, bytes, collate);
          if (!(left instanceof SQLFilterItem || left instanceof SQLFilterCondition))
          // FIXED VALUE, REPLACE IT
          {
            left = l;
          }
        }
      } else if (l instanceof BinaryField)
      // GET THE COPY OR MT REASONS
      {
        l = ((BinaryField) l).copy();
      }
    }

    if (binaryEvaluation) {
      binaryEvaluation = l instanceof BinaryField && r instanceof BinaryField;
    }

    if (!binaryEvaluation) {
      // no collate for regular expressions, otherwise quotes will result in no match
      Collate collate = null;
      if (iCurrentRecord != null && iCurrentRecord.isEntity()) {
        var entity = iCurrentRecord.asEntity();
        collate = operator instanceof QueryOperatorMatches ? null : getCollate(session, entity);
      }

      final var convertedValues = checkForConversion(session, l, r, collate);
      if (convertedValues != null) {
        l = convertedValues[0];
        r = convertedValues[1];
      }
    }

    Object result;
    try {
      result =
          operator.evaluateRecord(
              iCurrentRecord,
              iCurrentResult,
              this,
              l,
              r,
              iContext,
              RecordSerializerBinary.INSTANCE.getCurrentSerializer());
    } catch (CommandExecutionException e) {
      throw e;
    } catch (Exception e) {
      if (logger.isDebugEnabled()) {
        LogManager.instance()
            .debug(this, "Error on evaluating expression (%s)", logger, e, toString());
      }
      result = Boolean.FALSE;
    }

    return result;
  }