All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gwdg.metadataqa.marc.analysis.ShelfReadyAnalysis Maven / Gradle / Ivy

package de.gwdg.metadataqa.marc.analysis;

import de.gwdg.metadataqa.marc.MarcSubfield;
import de.gwdg.metadataqa.marc.dao.DataField;
import de.gwdg.metadataqa.marc.dao.record.BibliographicRecord;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ShelfReadyAnalysis {

  private ShelfReadyAnalysis() {
    throw new IllegalStateException("This is a utility class");
  }

  private static List headers = new LinkedList<>();
  static {
    for (ShelfReadyFieldsBooks field : ShelfReadyFieldsBooks.values()) {
      headers.add(field.name());
    }
  }

  public static List getScores(BibliographicRecord marcRecord) {
    List scores = new ArrayList<>();

    var total = 0.0;
    for (Map.Entry>> fieldEntry : marcRecord.getShelfReadyMap().entrySet()) {
      ShelfReadyFieldsBooks category = fieldEntry.getKey();
      boolean debug = category.equals(ShelfReadyFieldsBooks.LDR06);

      double score = 0.0;
      double count = (double) countSelectors(fieldEntry.getValue());

      for (Map.Entry> selector : fieldEntry.getValue().entrySet()) {
        String tag = selector.getKey();
        List codes = selector.getValue();

        if (codes != null && ! codes.isEmpty()) {
          Set collector = new HashSet<>();
          if (marcRecord.hasDatafield(tag)) {
            List dataFields = marcRecord.getDatafield(tag);
            for (DataField dataField : dataFields) {
              for (String code : codes) {
                List subfield = dataField.getSubfield(code);
                if (subfield != null && !subfield.isEmpty())
                  collector.add(tag + "$" + code);
              }
              if (category.isOneOf())
                break;
            }
          }
          score += (double) collector.size();
        } else {
          // no code
          count = 1;
          List values = marcRecord.select(category.getSelectors().get(0));
          if (!values.isEmpty()) {
            score += 1.0;
            if (category.isOneOf())
              break;
          }
        }
      }

      if (category.isOneOf()) {
        score = category.getScore();
      } else {
        double mean = count == 0.0 ? 0.0 : score / count;
        score = mean * category.getScore();
      }
      scores.add(score);
      total += score;
    }
    /*
    for (ShelfReadyFieldsBooks fieldEntry : ShelfReadyFieldsBooks.values()) {
      var score = 0.0;
      double count = (double) fieldEntry.getSelectors().size();
      for (MarcSpec selector : fieldEntry.getSelectors()) {
        List values = marcRecord.select(selector);
        if (!values.isEmpty()) {
          score += 1.0;
          if (fieldEntry.isOneOf())
            break;
        }
      }
      if (fieldEntry.isOneOf()) {
        score = fieldEntry.getScore();
      } else {
        double mean = score / count;
        score = mean * fieldEntry.getScore();
      }
      scores.add(score);
      total += score;
    }
  */
    total = total / scores.size();
    scores.add(total);
    return scores;
  }

  public static List getHeaders() {
    return headers;
  }

  private static int countSelectors(Map> value) {
    int count = 0;
    if (value != null && !value.isEmpty()) {
      for (Map.Entry> entry : value.entrySet()) {
        if (entry.getValue() == null)
          count++;
        else
          count += entry.getValue().size();
      }
    }
    return count;
  }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy