in glam/api/views.py [0:0]
def get_firefox_aggregations_from_pg(request, **kwargs):
# TODO: When glam starts sending "product", make it required.
REQUIRED_QUERY_PARAMETERS = ["channel", "probe", "aggregationLevel"]
if any([k not in kwargs.keys() for k in REQUIRED_QUERY_PARAMETERS]):
# Figure out which query parameter is missing.
missing = set(REQUIRED_QUERY_PARAMETERS) - set(kwargs.keys())
raise ValidationError(
"Missing required query parameters: {}".format(", ".join(sorted(missing)))
)
# Ensure that the product provided is one we support, defaulting to Firefox.
product = "firefox"
channel = kwargs.get("channel")
model_key = f"{product}-{channel}"
MODEL_MAP = {
"firefox-nightly": DesktopNightlyAggregationView,
"firefox-beta": DesktopBetaAggregationView,
"firefox-release": DesktopReleaseAggregationView,
}
try:
model = MODEL_MAP[model_key]
except KeyError:
raise ValidationError("Product not currently supported.")
num_versions = kwargs.get("versions", 3)
try:
max_version = int(model.objects.aggregate(Max("version"))["version__max"])
except (ValueError, KeyError):
raise ValidationError("Query version cannot be determined")
except TypeError:
# This happens when `version_max` is NULL and cannot be converted to an int,
# suggesting that we have no data for this model.
raise NotFound("No data found for the provided parameters")
versions = list(map(str, range(max_version, max_version - num_versions, -1)))
labels_cache = caches["probe-labels"]
if labels_cache.get("__labels__") is None:
Probe.populate_labels_cache()
os = kwargs.get("os", "*")
dimensions = [
Q(metric=kwargs["probe"]),
Q(version__in=versions),
Q(os=os),
]
aggregation_level = kwargs["aggregationLevel"]
# Whether to pull aggregations by version or build_id.
if aggregation_level == "version":
dimensions.append(Q(build_id="*"))
# counts = _get_firefox_counts(channel, os, versions, by_build=False)
shas = {}
elif aggregation_level == "build_id":
dimensions.append(~Q(build_id="*"))
# counts = _get_firefox_counts(channel, os, versions, by_build=True)
shas = _get_firefox_shas(channel)
if "process" in kwargs:
dimensions.append(Q(process=kwargs["process"]))
result = model.objects.filter(*dimensions)
response = []
for row in result:
data = {
"version": row.version,
"os": row.os,
"build_id": row.build_id,
"revision": shas.get(row.build_id, ""),
"process": row.process,
"metric": row.metric,
"metric_key": row.metric_key,
"metric_type": row.metric_type,
"total_users": row.total_users,
"sample_count": row.total_sample,
"histogram": row.histogram and orjson.loads(row.histogram) or "",
"non_norm_histogram": row.non_norm_histogram
and orjson.loads(row.non_norm_histogram)
or "",
"percentiles": row.percentiles and orjson.loads(row.percentiles) or "",
"non_norm_percentiles": row.non_norm_percentiles
and orjson.loads(row.non_norm_percentiles)
or "",
}
if row.client_agg_type:
if row.metric_type == "boolean":
data["client_agg_type"] = "boolean-histogram"
else:
data["client_agg_type"] = row.client_agg_type
# Get the total distinct client IDs for this set of dimensions.
# data["total_addressable_market"] = counts.get(f"{row.version}-{row.build_id}")
response.append(data)
_log_probe_query(request)
return response