private void compareSchema()

in core/src/main/java/com/jetbrains/youtrackdb/internal/core/db/tool/DatabaseCompare.java [168:342]


  private void compareSchema() {
    Schema schema1 = sessionOne.getMetadata().getImmutableSchemaSnapshot();
    Schema schema2 = sessionTwo.getMetadata().getImmutableSchemaSnapshot();

    var ok = true;
    for (var clazz : schema1.getClasses()) {
      var clazz2 = schema2.getClass(clazz.getName());

      if (clazz2 == null) {
        listener.onMessage(
            "\n- ERR: Class definition " + clazz.getName() + " for DB2 is null.");
        continue;
      }

      final var sc1 = clazz.getSuperClassesNames();
      final var sc2 = clazz2.getSuperClassesNames();

      if (!sc1.isEmpty() || !sc2.isEmpty()) {
        if (!new HashSet<>(sc1).containsAll(sc2) || !new HashSet<>(sc2).containsAll(sc1)) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " in DB1 is not equals in superclasses in DB2.");
          ok = false;
        }
      }

      if (!((SchemaClassInternal) clazz).getClassIndexes()
          .equals(((SchemaClassInternal) clazz2).getClassIndexes())) {
        listener.onMessage(
            "\n- ERR: Class definition for "
                + clazz.getName()
                + " in DB1 is not equals in indexes in DB2.");
        ok = false;
      }

      if (!Arrays.equals(clazz.getCollectionIds(), clazz2.getCollectionIds())) {
        listener.onMessage(
            "\n- ERR: Class definition for "
                + clazz.getName()
                + " in DB1 is not equals in collections in DB2.");
        ok = false;
      }
      if (!clazz.getCustomKeys().equals(clazz2.getCustomKeys())) {
        listener.onMessage(
            "\n- ERR: Class definition for "
                + clazz.getName()
                + " in DB1 is not equals in custom keys in DB2.");
        ok = false;
      }

      for (var prop1 : clazz.getDeclaredProperties()) {
        var prop2 = clazz2.getProperty(prop1.getName());
        if (prop2 == null) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as missed property "
                  + prop1.getName()
                  + "in DB2.");
          ok = false;
          continue;
        }
        if (prop1.getType() != prop2.getType()) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as not same type for property "
                  + prop1.getName()
                  + "in DB2. ");
          ok = false;
        }

        if (prop1.getLinkedType() != prop2.getLinkedType()) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as not same linkedtype for property "
                  + prop1.getName()
                  + "in DB2.");
          ok = false;
        }

        if (prop1.getMin() != null) {
          if (!prop1.getMin().equals(prop2.getMin())) {
            listener.onMessage(
                "\n- ERR: Class definition for "
                    + clazz.getName()
                    + " as not same min for property "
                    + prop1.getName()
                    + "in DB2.");
            ok = false;
          }
        }
        if (prop1.getMax() != null) {
          if (!prop1.getMax().equals(prop2.getMax())) {
            listener.onMessage(
                "\n- ERR: Class definition for "
                    + clazz.getName()
                    + " as not same max for property "
                    + prop1.getName()
                    + "in DB2.");
            ok = false;
          }
        }

        if (prop1.getMax() != null) {
          if (!prop1.getMax().equals(prop2.getMax())) {
            listener.onMessage(
                "\n- ERR: Class definition for "
                    + clazz.getName()
                    + " as not same regexp for property "
                    + prop1.getName()
                    + "in DB2.");
            ok = false;
          }
        }

        if (prop1.getLinkedClass() != null) {
          if (!prop1.getLinkedClass().equals(prop2.getLinkedClass())) {
            listener.onMessage(
                "\n- ERR: Class definition for "
                    + clazz.getName()
                    + " as not same linked class for property "
                    + prop1.getName()
                    + "in DB2.");
            ok = false;
          }
        }

        if (prop1.getLinkedClass() != null) {
          if (!prop1.getCustomKeys().equals(prop2.getCustomKeys())) {
            listener.onMessage(
                "\n- ERR: Class definition for "
                    + clazz.getName()
                    + " as not same custom keys for property "
                    + prop1.getName()
                    + "in DB2.");
            ok = false;
          }
        }
        if (prop1.isMandatory() != prop2.isMandatory()) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as not same mandatory flag for property "
                  + prop1.getName()
                  + "in DB2.");
          ok = false;
        }
        if (prop1.isNotNull() != prop2.isNotNull()) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as not same nut null flag for property "
                  + prop1.getName()
                  + "in DB2.");
          ok = false;
        }
        if (prop1.isReadonly() != prop2.isReadonly()) {
          listener.onMessage(
              "\n- ERR: Class definition for "
                  + clazz.getName()
                  + " as not same readonly flag setting for property "
                  + prop1.getName()
                  + "in DB2.");
          ok = false;
        }
      }
      if (!ok) {
        ++differences;
        ok = true;
      }
    }
  }