dimensions.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. def build_dimension(dim):
  2. if isinstance(dim, DimensionSpec):
  3. dim = dim.build()
  4. return dim
  5. class DimensionSpec(object):
  6. def __init__(self, dimension, output_name,
  7. extraction_function=None, filter_spec=None):
  8. self._dimension = dimension
  9. self._output_name = output_name
  10. self._extraction_function = extraction_function
  11. self._filter_spec = filter_spec
  12. def build(self):
  13. dimension_spec = {
  14. 'type': 'default',
  15. 'dimension': self._dimension,
  16. 'outputName': self._output_name
  17. }
  18. if self._extraction_function is not None:
  19. dimension_spec['type'] = 'extraction'
  20. dimension_spec['extractionFn'] = self._extraction_function.build()
  21. if self._filter_spec is not None:
  22. dimension_spec = self._filter_spec.build(dimension_spec)
  23. return dimension_spec
  24. class FilteredSpec(object):
  25. filter_type = None
  26. def build(self, delegate):
  27. dimension_spec = {
  28. 'type': self.filter_type,
  29. 'delegate': delegate,
  30. }
  31. return dimension_spec
  32. class ListFilteredSpec(FilteredSpec):
  33. filter_type = 'listFiltered'
  34. def __init__(self, values, is_whitelist=True):
  35. self._values = values
  36. self._is_whitelist = is_whitelist
  37. def build(self, dimension_spec):
  38. filtered_dimension_spec = super(ListFilteredSpec, self).build(dimension_spec)
  39. filtered_dimension_spec['values'] = self._values
  40. if not self._is_whitelist:
  41. filtered_dimension_spec['isWhitelist'] = False
  42. return filtered_dimension_spec
  43. class RegexFilteredSpec(FilteredSpec):
  44. filter_type = 'regexFiltered'
  45. def __init__(self, pattern):
  46. self._pattern = pattern
  47. def build(self, dimension_spec):
  48. filtered_dimension_spec = super(RegexFilteredSpec, self).build(dimension_spec)
  49. filtered_dimension_spec['pattern'] = self._pattern
  50. return filtered_dimension_spec
  51. class ExtractionFunction(object):
  52. extraction_type = None
  53. def build(self):
  54. return {'type': self.extraction_type}
  55. class BaseRegexExtraction(ExtractionFunction):
  56. def __init__(self, expr):
  57. super(BaseRegexExtraction, self).__init__()
  58. self._expr = expr
  59. def build(self):
  60. extractor = super(BaseRegexExtraction, self).build()
  61. extractor['expr'] = self._expr
  62. return extractor
  63. class RegexExtraction(BaseRegexExtraction):
  64. extraction_type = 'regex'
  65. class PartialExtraction(BaseRegexExtraction):
  66. extraction_type = 'partial'
  67. class JavascriptExtraction(ExtractionFunction):
  68. extraction_type = 'javascript'
  69. def __init__(self, func, injective=False):
  70. super(JavascriptExtraction, self).__init__()
  71. self._func = func
  72. self._injective = injective
  73. def build(self):
  74. extractor = super(JavascriptExtraction, self).build()
  75. extractor['function'] = self._func
  76. extractor['injective'] = self._injective
  77. return extractor
  78. class TimeFormatExtraction(ExtractionFunction):
  79. extraction_type = 'timeFormat'
  80. def __init__(self, format, locale=None, time_zone=None):
  81. super(TimeFormatExtraction, self).__init__()
  82. self._format = format
  83. self._locale = locale
  84. self._time_zone = time_zone
  85. def build(self):
  86. extractor = super(TimeFormatExtraction, self).build()
  87. extractor['format'] = self._format
  88. if self._locale:
  89. extractor['locale'] = self._locale
  90. if self._time_zone:
  91. extractor['timeZone'] = self._time_zone
  92. return extractor
  93. class LookupExtraction(ExtractionFunction):
  94. extraction_type = 'lookup'
  95. lookup_type = None
  96. def __init__(self, retain_missing_values=False,
  97. replace_missing_values=None, injective=False):
  98. super(LookupExtraction, self).__init__()
  99. self._retain_missing_values = retain_missing_values
  100. self._replace_missing_values = replace_missing_values
  101. self._injective = injective
  102. def build(self):
  103. extractor = super(LookupExtraction, self).build()
  104. extractor['lookup'] = self.build_lookup()
  105. extractor['retainMissingValue'] = self._retain_missing_values
  106. extractor['replaceMissingValueWith'] = self._replace_missing_values
  107. extractor['injective'] = self._injective
  108. return extractor
  109. def build_lookup(self):
  110. return {'type': self.lookup_type}
  111. class MapLookupExtraction(LookupExtraction):
  112. lookup_type = 'map'
  113. def __init__(self, mapping, **kwargs):
  114. super(MapLookupExtraction, self).__init__(**kwargs)
  115. self._mapping = mapping
  116. def build_lookup(self):
  117. lookup = super(MapLookupExtraction, self).build_lookup()
  118. lookup['map'] = self._mapping
  119. return lookup
  120. class NamespaceLookupExtraction(LookupExtraction):
  121. lookup_type = 'namespace'
  122. def __init__(self, namespace, **kwargs):
  123. super(NamespaceLookupExtraction, self).__init__(**kwargs)
  124. self._namespace = namespace
  125. def build_lookup(self):
  126. lookup = super(NamespaceLookupExtraction, self).build_lookup()
  127. lookup['namespace'] = self._namespace
  128. return lookup