Tag Counter - Archi-Lab/prox-tag-service GitHub Wiki

Tag Counter

Tag Counter werden verwendet, um zu zählen, wie oft zwei Tags gemeinsam verwendet wurden. Daraus können dann anschließend die Vorschläge ermittelt werden.

Model

Ein Tag Counter besteht immer aus den zwei Tags und der Anzahl der gemeinsamen Verwendungen (Count).

Tag Counter Updater

Im Tag Counter Updater werden die Tag Counter immer wieder neu berechnet. Dazu werden zuerst alle Tag Collection geladen und anschließend wird der Counter für jede Tag Kombination in jeder Tag Collection aktualisiert.

for (TagCollection col : collection){
  for (int i = 0; i < col.tags.size() - 1; i++){
    for(int k = i + 1; k < col.tags.size(); k++){
          var tag1 = tags.get(i);
          var tag2 = tags.get(k);

          ...
    }
  }
}

Scheduling

Das Aktualisieren der Tag Counter wird nicht nach jedem Bearbeiten von Projekten oder hinzufügen von Tags neu ausgeführt, sondern läuft in einem fest definierten Zeitintervall automatisch ab.
Wir haben uns für diese Methode entschieden, da beim hinzufügen von Tags jeder Tag einzeln eingetragen wird und wenn mehrere neue Tags hinzukommen, würde diese Berechnung oft ausgeführt werden müssen.

Die Zeiten für die Aktualisierung der Tag Counter kann nicht application.yml eingestellt werden.
Zuerst kann eine Verzögerung angegeben werden, die nach dem Start des Services gewartet werden soll und anschließend die Zeit in Minuten, für die regelmäßige Aktualisierung.

tagCounter:
  delay:
    initial:
       seconds: 10
  minutes: 120

Aktualisierung bei Änderung der TagCollection-Tag Association

Ein Problem bei der Aktualisierung der Tag-Counter über einen Timer stellt die verzögerte Berechnung der Tag-Counter dar, wenn eine neue Liste von Tags festgelegt wird. Um diesem Problem entgegenzuwirken, wurde schlussendlich ein Konzept ohne Timer implementiert. Mithilfe eines RepositoryEventListeners können die POST, PUT und PATCH Anfragen auf die Association einer TagCollection abgefangen werden.

@Component
@RepositoryEventHandler
public class TagCollectionEventHandler {

  @Autowired
  private TagCounterUpdater tagCounterUpdater;


  @HandleBeforeLinkSave
  public void handleTagCollectionUpdate(TagCollection tagCollection, List<Tag> oldTags) {
    tagCounterUpdater.updateTagCounter(tagCollection, oldTags);
  }
}

Die bestehenden Tag-Counter werden nun bei einer Änderung der Tags für eine TagCollection wie folgt aktualisiert:

  • Falls vorher schon Tags für die TagCollection vorhanden waren, werden die Vorkommen aus den bestehenden Tag-Countern entfernt.
  • Die Vorkommen der neu verknüpften Tags werden additiv auf die bestehenden Tag Counter aufgezählt, sodass eine komplette Neuberechnung der Tag-Counter nicht vonnöten ist.
⚠️ **GitHub.com Fallback** ⚠️