Пример #1
0
    /**
     * Gets distance between numerial values
     *
     * @param srcField
     * @param srcVal
     * @param trgField
     * @param trgVal
     * @return
     */
    private double getDistForNumeric(Field srcField, int srcVal, Field trgField, int trgVal) {
      double dist = 0;
      boolean linear = false;
      String distFun = srcField.getNumDistFunction();

      if (distFun.equals("equalSoft")) {
        linear = true;
      } else if (distFun.equals("equalHard")) {
        dist = srcVal == trgVal ? 0 : 1;
      } else if (distFun.equals("minSoft")) {
        if (trgVal >= srcVal) {
          dist = 0;
        } else {
          linear = true;
        }
      } else if (distFun.equals("minHard")) {
        dist = trgVal >= srcVal ? 0 : 1;
      } else if (distFun.equals("maxSoft")) {
        if (trgVal <= srcVal) {
          dist = 0;
        } else {
          linear = true;
        }
      } else if (distFun.equals("maxHard")) {
        dist = trgVal <= srcVal ? 0 : 1;
      }

      if (linear) {
        if (trgField.getMax() > trgField.getMin()) {
          dist = ((double) (srcVal - trgVal)) / (trgField.getMax() - trgField.getMin());
        } else {
          int max = srcVal > trgVal ? srcVal : trgVal;
          double diff = ((double) (srcVal - trgVal)) / max;
          if (diff < 0) {
            diff = -diff;
          }
          dist = diff > schema.getNumericDiffThreshold() ? 1.0 : 0.0;
        }
        if (dist < 0) {
          dist = -dist;
        }
      }

      return dist;
    }