match_data.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from __future__ import unicode_literals
  2. from copy import deepcopy
  3. class MatchData:
  4. """Contains and collects metadata about a matching document.
  5. A single instance of lunr.MatchData is returned as part of every
  6. lunr.Index.Result.
  7. """
  8. def __init__(self, term=None, field=None, metadata=None):
  9. self.metadata = {}
  10. if term is not None:
  11. self.metadata[term] = {}
  12. if field is not None:
  13. self.metadata[term][field] = (
  14. deepcopy(metadata) if metadata is not None else {}
  15. )
  16. def __repr__(self):
  17. return '<MatchData "{}">'.format(",".join(sorted(self.metadata.keys())))
  18. def combine(self, other):
  19. """An instance of lunr.MatchData will be created for every term that
  20. matches a document.
  21. However only one instance is required in a lunr.Index~Result. This
  22. method combines metadata from another instance of MatchData with this
  23. object's metadata.
  24. """
  25. for term in other.metadata.keys():
  26. if term not in self.metadata:
  27. self.metadata[term] = {}
  28. fields = other.metadata[term].keys()
  29. for field in fields:
  30. if field not in self.metadata[term]:
  31. self.metadata[term][field] = {}
  32. keys = other.metadata[term][field].keys()
  33. for key in keys:
  34. if key not in self.metadata[term][field]:
  35. self.metadata[term][field][key] = other.metadata[term][field][
  36. key
  37. ]
  38. else:
  39. self.metadata[term][field][key].extend(
  40. other.metadata[term][field][key]
  41. )
  42. def add(self, term, field, metadata):
  43. """Add metadata for a term/field pair to this instance of match data"""
  44. if term not in self.metadata:
  45. self.metadata[term] = {field: metadata}
  46. return
  47. if field not in self.metadata[term]:
  48. self.metadata[term][field] = metadata
  49. return
  50. for key in metadata.keys():
  51. if key in self.metadata[term][field]:
  52. self.metadata[term][field][key].extend(metadata[key])
  53. else:
  54. self.metadata[term][field][key] = metadata[key]
  55. def __eq__(self, other):
  56. return self.metadata == other.metadata