Skip to content

Commit

Permalink
chore: Move field-level check detail API method to controller project,
Browse files Browse the repository at this point in the history
  • Loading branch information
jpmckinney committed Jan 21, 2023
1 parent 69e76b2 commit 6f3bd0a
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 58 deletions.
3 changes: 1 addition & 2 deletions backend/api/urls.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from django.urls import path

from api.views import dataset_distinct_values, dataset_filter_items, field_level_detail, resource_level_detail
from api.views import dataset_distinct_values, dataset_filter_items, resource_level_detail

urlpatterns = [
# Check details
path("api/field_level_detail/<dataset_id>/<path>", field_level_detail, name="field_level_detail"),
path("api/resource_level_detail/<dataset_id>/<check_name>", resource_level_detail, name="resource_level_detail"),
# Filter datasets
path("api/dataset_filter_items", dataset_filter_items, name="dataset_filter_items"),
Expand Down
52 changes: 0 additions & 52 deletions backend/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,58 +81,6 @@ def dataset_distinct_values(request, dataset_id, json_path, sub_string=""):
return JsonResponse([{"value": el[0], "count": el[1]} for el in query_set], safe=False)


def field_level_detail(request, dataset_id, path):
start_time = time.time()

result = None

with connections["data"].cursor() as cursor:
cursor.execute(
"""
select data->%s
from report
where dataset_id = %s and
type = 'field_level_check' and
data ? %s;
""",
[path, dataset_id, path],
)
rows = cursor.fetchall()

if not rows:
return JsonResponse({"error": f"no results for dataset_id: {dataset_id}, path: '{path}' combination"})

result = rows[0][0]

# getting examples
cursor.execute(
"""
select data
from field_level_check_examples
where dataset_id = %s and path = %s;
""",
[dataset_id, path],
)
data = cursor.fetchall()[0][0]

result["coverage"]["passed_examples"] = data["coverage"]["passed_examples"]
result["coverage"]["failed_examples"] = data["coverage"]["failed_examples"]
result["quality"]["passed_examples"] = data["quality"]["passed_examples"]
result["quality"]["failed_examples"] = data["quality"]["failed_examples"]

for check_name, check in data["coverage"]["checks"].items():
result["coverage"]["checks"][check_name]["passed_examples"] = check["passed_examples"]
result["coverage"]["checks"][check_name]["failed_examples"] = check["failed_examples"]

for check_name, check in data["quality"]["checks"].items():
result["quality"]["checks"][check_name]["passed_examples"] = check["passed_examples"]
result["quality"]["checks"][check_name]["failed_examples"] = check["failed_examples"]

result["time"] = time.time() - start_time

return JsonResponse(result)


def resource_level_detail(request, dataset_id, check_name):
start_time = time.time()

Expand Down
1 change: 1 addition & 0 deletions backend/controller/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
router.register(r"data_items", views.DataItemViewSet, basename="data-item")

urlpatterns = router.urls + [
path("datasets/<pk>/field_level/<name>/", views.FieldLevelDetail.as_view()),
# https://www.django-rest-framework.org/api-guide/schemas/#generating-a-dynamic-schema-with-schemaview
path(
"openapi",
Expand Down
25 changes: 24 additions & 1 deletion backend/controller/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import time

from django.db import connections
from django.db.models import F, OuterRef, Subquery
from django.shortcuts import get_object_or_404
from psycopg2.sql import SQL, Identifier
from rest_framework import mixins, serializers, status, viewsets
from rest_framework import mixins, serializers, status, views, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.schemas.openapi import AutoSchema
Expand All @@ -13,6 +15,7 @@
DatasetFilter,
DatasetLevelCheck,
FieldLevelCheck,
FieldLevelCheckExamples,
ProgressMonitorDataset,
Report,
TimeVarianceLevelCheck,
Expand Down Expand Up @@ -313,3 +316,23 @@ def coverage(self, request, pk=None):
counts[key] += int(r[1])

return Response(counts)


class FieldLevelDetail(views.APIView):
def get(self, request, pk, name, format=None):
start_time = time.time()

detail = get_object_or_404(Report, dataset=pk, type="field_level_check", data__has_key=name).data[name]

data = get_object_or_404(FieldLevelCheckExamples, dataset=pk, path=name).data

for key in ("coverage", "quality"):
detail[key]["passed_examples"] = data[key]["passed_examples"]
detail[key]["failed_examples"] = data[key]["failed_examples"]
for check_name, check in data[key]["checks"].items():
detail[key]["checks"][check_name]["passed_examples"] = check["passed_examples"]
detail[key]["checks"][check_name]["failed_examples"] = check["failed_examples"]

detail["time"] = time.time() - start_time

return Response(detail)
3 changes: 1 addition & 2 deletions frontend/src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ var config = {
resourceLevelReport: "datasets/{id}/compiled_release_level_report/",
datasetLevelReport: "datasets/{id}/dataset_level_report/",
timeVarianceLevelReport: "datasets/{id}/time_based_report/",
// Check detail
fieldDetail: "api/field_level_detail",
fieldLevelDetail: "datasets/{id}/field_level/{name}/",
resourceLevelCheckDetail: "api/resource_level_detail",
// Filter datasets
datasetFilterItems: "api/dataset_filter_items",
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,10 @@ export default new Vuex.Store({
if (checkDetail == null || (checkDetail != null && !checkDetail.examplesLoaded)) {
if (state.dataset != null && path != null) {
var url =
CONFIG.apiBaseUrl + CONFIG.apiEndpoints.fieldDetail + "/" + state.dataset.id + "/" + path;
CONFIG.apiBaseUrl +
CONFIG.apiEndpoints.fieldLevelDetail
.replace(/{id}/g, state.dataset.id)
.replace(/{name}/g, path);

var aaa = path;
axios
Expand Down

0 comments on commit 6f3bd0a

Please sign in to comment.