Browse Source

Add transitive solution for snowballing stages

master
Maya Herrscher 2 months ago
parent
commit
65a6008c8f
  1. 41
      sok/models.py

41
sok/models.py

@ -103,6 +103,24 @@ class Publication(models.Model):
def relevant_referenced_by(self) -> QuerySet: def relevant_referenced_by(self) -> QuerySet:
return self.referenced_by.filter(exclusion_criteria__isnull=True) return self.referenced_by.filter(exclusion_criteria__isnull=True)
def stage_added(self) -> int:
if not self.is_relevant:
return 10000
if self.sources.exists():
return 0
if self.referenced_by.filter(exclusion_criteria__isnull=True, sources__isnull=False) or self.references.filter(exclusion_criteria__isnull=True, sources__isnull=False):
return 1
if ref_by := self.referenced_by.filter(exclusion_criteria__isnull=True):
stages = set([ref.stage_added() for ref in ref_by])
return 1 + sorted(stages)[0]
if refs := self.references.filter(exclusion_criteria__isnull=True):
stages = set([ref.stage_added() for ref in refs])
return 1 + sorted(stages)[0]
@property @property
def stage(self) -> Optional[str]: def stage(self) -> Optional[str]:
if not self.is_relevant: if not self.is_relevant:
@ -113,24 +131,27 @@ class Publication(models.Model):
return 'primary' return 'primary'
# Referenced by primary (backward snowballing) # Referenced by primary (backward snowballing)
# TODO make transitive # DONE make transitive
if self.referenced_by.filter(exclusion_criteria__isnull=True, sources__isnull=False): if self.referenced_by.filter(exclusion_criteria__isnull=True, sources__isnull=False):
return 'secondary' return 'secondary'
# References a primary (forward snowballing) # References a primary (forward snowballing)
# TODO make transitive
if self.references.filter(exclusion_criteria__isnull=True, sources__isnull=False): if self.references.filter(exclusion_criteria__isnull=True, sources__isnull=False):
return 'tertiary' return 'tertiary'
if ref_by := self.referenced_by.filter(exclusion_criteria__isnull=True): # prefer secondary over tertiary regardless of stage for now
stages = set([ref.stage for ref in ref_by]) exclude = False
if 'secondary' in stages: return 'sec-secondary' if self.referenced_by.filter(exclusion_criteria__isnull=True):
elif 'tertiary' in stages: return 'sec-tertiary' stage = self.stage_added()
if stage > 10000: exclude = True
else: return str(stage) + '-secondary'
if refs := self.references.filter(exclusion_criteria__isnull=True): if self.references.filter(exclusion_criteria__isnull=True):
stages = set([ref.stage for ref in ref_by]) stage = self.stage_added()
if 'secondary' in stages: return 'tert-secondary' if stage > 10000: return 'excluded-by-ref'
elif 'tertiary' in stages: return 'tert-tertiary' else: return str(stage) + '-tertiary'
if exclude: return 'excluded-by-ref'
return None return None

Loading…
Cancel
Save