code: private PropertyMappingImpl disambiguateMappings() {
      List<WeightPropertyMappingImpl> weightMappings = new ArrayList<WeightPropertyMappingImpl>(mappings.size());
      for (PropertyMappingImpl mapping : mappings) {
        SourceTokensMatcher matcher = createSourceTokensMatcher(mapping);
        DestTokenIterator destTokenIterator = new DestTokenIterator(mapping);
        while (destTokenIterator.hasNext())
          matcher.match(destTokenIterator.next());
  
        double matchRatio = (((double) matcher.matches()) * matcher.orderMatchWeight())
            / ((double) matcher.total() + destTokenIterator.total());
        weightMappings.add(new WeightPropertyMappingImpl(mapping, matchRatio));
      }
  
      Collections.sort(weightMappings);
      if (weightMappings.get(0).ratio == weightMappings.get(1).ratio)
        return null;
      return weightMappings.get(0).mapping;
    }
docs: Disambiguates the captured mappings by looking for the mapping with property tokens that most
  closely match the destination. Match closeness is calculated as the total number of matched
  source to destination tokens * the weight that the order of properties are matched /
  the total number of source and destination tokens. Currently this algorithm does not consider
  class name tokens.
  
  @return closest matching mapping, else {@code null} if one could not be determined