docs: public static boolean isEqualOrNull( final DTCellValue52 dcv1,
                                           final DTCellValue52 dcv2 ) {
          if ( dcv1 == null && dcv2 == null ) {
              return true;
          } else if ( dcv1 == null && dcv2 != null ) {
              return false;
          } else if ( dcv1 != null && dcv2 == null ) {
              return false;
          } else if ( !dcv1.getDataType().equals( dcv2.getDataType() ) ) {
              return false;
          } else {
              //Both DataTypes are equal here, so just check one DCV's type
              switch ( dcv1.getDataType() ) {
                  case BOOLEAN:
                      if ( dcv1.getBooleanValue() == null && dcv2.getBooleanValue() == null ) {
                          return true;
                      } else if ( dcv1.getBooleanValue() == null && dcv2.getBooleanValue() != null ) {
                          return false;
                      } else if ( dcv1.getBooleanValue() != null && dcv2.getBooleanValue() == null ) {
                          return false;
                      } else {
                          return dcv1.getBooleanValue().equals( dcv2.getBooleanValue() );
                      }
                  case DATE:
                      if ( dcv1.getDateValue() == null && dcv2.getDateValue() == null ) {
                          return true;
                      } else if ( dcv1.getDateValue() == null && dcv2.getDateValue() != null ) {
                          return false;
                      } else if ( dcv1.getDateValue() != null && dcv2.getDateValue() == null ) {
                          return false;
                      } else {
                          return dcv1.getDateValue().equals( dcv2.getDateValue() );
                      }
                  case NUMERIC:
                  case NUMERIC_BIGDECIMAL:
                  case NUMERIC_BIGINTEGER:
                  case NUMERIC_BYTE:
                  case NUMERIC_DOUBLE:
                  case NUMERIC_FLOAT:
                  case NUMERIC_INTEGER:
                  case NUMERIC_LONG:
                  case NUMERIC_SHORT:
                      if ( dcv1.getNumericValue() == null && dcv2.getNumericValue() == null ) {
                          return true;
                      } else if ( dcv1.getNumericValue() == null && dcv2.getNumericValue() != null ) {
                          return false;
                      } else if ( dcv1.getNumericValue() != null && dcv2.getNumericValue() == null ) {
                          return false;
                      } else {
                          return dcv1.getNumericValue().equals( dcv2.getNumericValue() );
                      }
                  default:
                      if ( dcv1.getStringValue() == null && dcv2.getStringValue() == null ) {
                          return true;
                      } else if ( dcv1.getStringValue() == null && dcv2.getStringValue() != null ) {
                          return false;
                      } else if ( dcv1.getStringValue() != null && dcv2.getStringValue() == null ) {
                          return false;
                      } else {
                          return dcv1.getStringValue().equals( dcv2.getStringValue() );
                      }
              }
          }
      }