in core/src/main/java/com/jetbrains/youtrackdb/internal/core/serialization/serializer/record/binary/BinaryComparatorV0.java [74:680]
public boolean isEqual(DatabaseSessionInternal session, final BinaryField iField1,
final BinaryField iField2) {
final var fieldValue1 = iField1.bytes;
final var offset1 = fieldValue1.offset;
final var fieldValue2 = iField2.bytes;
final var offset2 = fieldValue2.offset;
try {
switch (iField1.type) {
case INTEGER: {
final var value1 = VarIntSerializer.readAsInteger(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case DATE: {
final var value2 =
(VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY);
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
return Integer.parseInt(readString(fieldValue2)) == value1;
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.intValue();
}
}
break;
}
case LONG: {
final var value1 = VarIntSerializer.readAsLong(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case DATE: {
final var value2 =
(VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY);
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
return Long.parseLong(readString(fieldValue2)) == value1;
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.longValue();
}
}
break;
}
case SHORT: {
final var value1 = VarIntSerializer.readAsShort(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case DATE: {
final var value2 =
(VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY);
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
return Short.parseShort(readString(fieldValue2)) == value1;
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.shortValue();
}
}
break;
}
case STRING: {
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return Integer.parseInt(readString(fieldValue1)) == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return Long.parseLong(readString(fieldValue1)) == value2;
}
case DATE: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY;
return Long.parseLong(readString(fieldValue1)) == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return Short.parseShort(readString(fieldValue1)) == value2;
}
case BYTE: {
final var value2 = readByte(fieldValue2);
return Byte.parseByte(readString(fieldValue1)) == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return Float.parseFloat(readString(fieldValue1)) == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return Double.parseDouble(readString(fieldValue1)) == value2;
}
case STRING: {
final var len1 = VarIntSerializer.readAsInteger(fieldValue1);
final var len2 = VarIntSerializer.readAsInteger(fieldValue2);
if (len1 != len2) {
return false;
}
final Collate collate;
if (iField1.collate != null
&& !DefaultCollate.NAME.equals(iField1.collate.getName())) {
collate = iField1.collate;
} else if (iField2.collate != null
&& !DefaultCollate.NAME.equals(iField2.collate.getName())) {
collate = iField2.collate;
} else {
collate = null;
}
if (collate != null) {
final var str1 =
(String)
collate.transform(
stringFromBytes(fieldValue1.bytes, fieldValue1.offset, len1));
final var str2 =
(String)
collate.transform(
stringFromBytes(fieldValue2.bytes, fieldValue2.offset, len2));
return str1.equals(str2);
} else {
for (var i = 0; i < len1; ++i) {
if (fieldValue1.bytes[fieldValue1.offset + i]
!= fieldValue2.bytes[fieldValue2.offset + i]) {
return false;
}
}
}
return true;
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return new BigDecimal(readString(fieldValue1)).equals(value2);
}
case BOOLEAN: {
final var value2 = readByte(fieldValue2) == 1;
return Boolean.parseBoolean(readString(fieldValue1)) == value2;
}
}
break;
}
case DOUBLE: {
final var value1AsLong = readLong(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case SHORT: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final double value2AsLong = readLong(fieldValue2);
return value1AsLong == value2AsLong;
}
case STRING: {
final var value1 = Double.longBitsToDouble(value1AsLong);
return Double.parseDouble(readString(fieldValue2)) == value1;
}
case DECIMAL: {
final var value1 = Double.longBitsToDouble(value1AsLong);
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.doubleValue();
}
}
break;
}
case FLOAT: {
final var value1AsInt = readInteger(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case SHORT: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final float value2AsInt = readInteger(fieldValue2);
return value1AsInt == value2AsInt;
}
case DOUBLE: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
final var value1 = Float.intBitsToFloat(value1AsInt);
return Float.parseFloat(readString(fieldValue2)) == value1;
}
case DECIMAL: {
final var value1 = Float.intBitsToFloat(value1AsInt);
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.floatValue();
}
}
break;
}
case BYTE: {
final var value1 = readByte(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case BYTE: {
final var value2 = readByte(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
final var value2 = Byte.parseByte((readString(fieldValue2)));
return value1 == value2;
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.byteValue();
}
}
break;
}
case BOOLEAN: {
final var value1 = readByte(fieldValue1) == 1;
switch (iField2.type) {
case BOOLEAN: {
final var value2 = readByte(fieldValue2) == 1;
return value1 == value2;
}
case STRING: {
final var str = readString(fieldValue2);
return Boolean.parseBoolean(str) == value1;
}
}
break;
}
case DATE: {
final var value1 = VarIntSerializer.readAsLong(fieldValue1) * MILLISEC_PER_DAY;
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
var value2 = VarIntSerializer.readAsLong(fieldValue2);
value2 =
convertDayToTimezone(
DateHelper.getDatabaseTimeZone(session), TimeZone.getTimeZone("GMT"), value2);
return value1 == value2;
}
case DATE: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY;
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.longValue();
}
}
break;
}
case DATETIME: {
final var value1 = VarIntSerializer.readAsLong(fieldValue1);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1 == value2;
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1 == value2;
}
case DATE: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2) * MILLISEC_PER_DAY;
return value1 == value2;
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1 == value2;
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1 == value2;
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1 == value2;
}
case STRING: {
final var value2AsString = readString(fieldValue2);
if (IOUtils.isLong(value2AsString)) {
final var value2 = Long.parseLong(value2AsString);
return value1 == value2;
}
try {
final DateFormat dateFormat;
if (session != null) {
dateFormat = DateHelper.getDateTimeFormatInstance(session);
} else {
dateFormat =
new SimpleDateFormat(StorageConfiguration.DEFAULT_DATETIME_FORMAT);
}
final var value2AsDate = dateFormat.parse(value2AsString);
final var value2 = value2AsDate.getTime();
return value1 == value2;
} catch (ParseException ignore) {
try {
final SimpleDateFormat dateFormat;
if (session != null) {
dateFormat = session.getStorageInfo().getConfiguration()
.getDateFormatInstance();
} else {
dateFormat =
new SimpleDateFormat(StorageConfiguration.DEFAULT_DATE_FORMAT);
}
final var value2AsDate = dateFormat.parse(value2AsString);
final var value2 = value2AsDate.getTime();
return value1 == value2;
} catch (ParseException ignored) {
return new Date(value1).toString().equals(value2AsString);
}
}
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1 == value2.longValue();
}
}
break;
}
case BINARY: {
if (Objects.requireNonNull(iField2.type) == PropertyTypeInternal.BINARY) {
final var length1 = VarIntSerializer.readAsInteger(fieldValue1);
final var length2 = VarIntSerializer.readAsInteger(fieldValue2);
if (length1 != length2) {
return false;
}
for (var i = 0; i < length1; ++i) {
if (fieldValue1.bytes[fieldValue1.offset + i]
!= fieldValue2.bytes[fieldValue2.offset + i]) {
return false;
}
}
return true;
}
break;
}
case LINK: {
switch (iField2.type) {
case LINK: {
final var collectionId1 = VarIntSerializer.readAsInteger(fieldValue1);
final var collectionId2 = VarIntSerializer.readAsInteger(fieldValue2);
if (collectionId1 != collectionId2) {
return false;
}
final var collectionPos1 = VarIntSerializer.readAsLong(fieldValue1);
final var collectionPos2 = VarIntSerializer.readAsLong(fieldValue2);
if (collectionPos1 == collectionPos2) {
return true;
}
break;
}
case STRING: {
return readOptimizedLink(fieldValue1, false)
.toString()
.equals(readString(fieldValue2));
}
}
break;
}
case DECIMAL: {
final var value1 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue1.bytes, fieldValue1.offset);
switch (iField2.type) {
case INTEGER: {
final var value2 = VarIntSerializer.readAsInteger(fieldValue2);
return value1.equals(new BigDecimal(value2));
}
case LONG:
case DATETIME: {
final var value2 = VarIntSerializer.readAsLong(fieldValue2);
return value1.equals(new BigDecimal(value2));
}
case SHORT: {
final var value2 = VarIntSerializer.readAsShort(fieldValue2);
return value1.equals(new BigDecimal(value2));
}
case FLOAT: {
final var value2 = Float.intBitsToFloat(readInteger(fieldValue2));
return value1.equals(new BigDecimal(value2));
}
case DOUBLE: {
final var value2 = Double.longBitsToDouble(readLong(fieldValue2));
return value1.equals(new BigDecimal(value2));
}
case STRING: {
return value1.toString().equals(readString(fieldValue2));
}
case DECIMAL: {
final var value2 =
DecimalSerializer.INSTANCE.deserialize(session.getSerializerFactory(),
fieldValue2.bytes, fieldValue2.offset);
return value1.equals(value2);
}
}
break;
}
}
} finally {
fieldValue1.offset = offset1;
fieldValue2.offset = offset2;
}
return false;
}