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