public boolean isEqual()

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