Skip to content

Commit

Permalink
Merge pull request #1268 from concord-consortium/187314125-research-c…
Browse files Browse the repository at this point in the history
…lasses-summary

Optimize research classes API
  • Loading branch information
pjanik committed Apr 3, 2024
2 parents a6799b3 + 82b6ca2 commit ebb5770
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 25 deletions.
2 changes: 1 addition & 1 deletion rails/app/assets/javascripts/react-components.js

Large diffs are not rendered by default.

60 changes: 41 additions & 19 deletions rails/app/controllers/api/v1/researcher_classes_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,56 +39,78 @@ def query(options, user)
ids[:runnables] = options[:runnables].split(',').map(&:to_i) if options[:runnables] && !options[:runnables].empty?

classes_subquery = classes_query(options, user, classes, ids)
classes_ids_subbquery = classes_subquery.select(:id)
classes_ids_subquery = classes_subquery.select(:id)

if options[:load_only]
# Load results just for one field
# Load results just for one field and no totals
case options[:load_only]
when "teachers"
results[:hits] = {teachers: teacher_query(options, user, teachers, classes_ids_subbquery)}
results[:hits] = {teachers: teacher_query(options, user, teachers, classes_ids_subquery)}
when "cohorts"
results[:hits] = {cohorts: cohorts_query(options, user, cohorts, classes_ids_subbquery)}
results[:hits] = {cohorts: cohorts_query(options, user, cohorts, classes_ids_subquery)}
when "runnables"
results[:hits] = {runnables: runnables_query(options, user, runnables, classes_ids_subbquery)}
results[:hits] = {runnables: runnables_query(options, user, runnables, classes_ids_subquery)}
end
else
results[:hits] = {
teachers: teacher_query(options, user, teachers, classes_ids_subbquery),
cohorts: cohorts_query(options, user, cohorts, classes_ids_subbquery),
runnables: runnables_query(options, user, runnables, classes_ids_subbquery),
classes: classes_mapping(classes_subquery)
}
results[:totals] = {
teachers: teacher_query(options, user, teachers, classes_ids_subquery, true),
cohorts: cohorts_query(options, user, cohorts, classes_ids_subquery, true),
runnables: runnables_query(options, user, runnables, classes_ids_subquery, true),
classes: results[:hits][:classes].count
}
end

return results
end

def teacher_query(options, user, scope, clazz_ids_subquery)
scope
def teacher_query(options, user, scope, clazz_ids_subquery, count_only = false)
scope = scope
.joins("INNER JOIN portal_teacher_clazzes ON portal_teacher_clazzes.teacher_id = portal_teachers.id")
.where(portal_teacher_clazzes: { clazz_id: clazz_ids_subquery })
.distinct
.joins(:user)
.select("portal_teachers.id, CONCAT(users.first_name, ' ', users.last_name, ' (', users.login ,')') AS label")

if count_only
scope.count("portal_teachers.id")
else
scope.joins(:user)
.select("portal_teachers.id, CONCAT(users.first_name, ' ', users.last_name, ' (', users.login ,')') AS label")
.order("label")
end
end

def cohorts_query(options, user, scope, clazz_ids_subquery)
scope
def cohorts_query(options, user, scope, clazz_ids_subquery, count_only = false)
scope = scope
.joins("INNER JOIN admin_cohort_items ON admin_cohort_items.item_type = 'Portal::Teacher' AND admin_cohort_items.admin_cohort_id = admin_cohorts.id")
.joins("INNER JOIN portal_teacher_clazzes ON admin_cohort_items.item_id = portal_teacher_clazzes.teacher_id")
.where(portal_teacher_clazzes: { clazz_id: clazz_ids_subquery })
.joins("LEFT OUTER JOIN admin_projects ON admin_projects.id = admin_cohorts.project_id")
.distinct
.select("admin_cohorts.id, CONCAT(COALESCE(admin_projects.name,'No Project'), ': ', admin_cohorts.name) as label")
.order("label")

if count_only
scope.count("admin_cohorts.id")
else
scope
.select("admin_cohorts.id, CONCAT(COALESCE(admin_projects.name,'No Project'), ': ', admin_cohorts.name) as label")
.order("label")
end
end

def runnables_query(options, user, scope, clazz_ids_subquery)
scope
def runnables_query(options, user, scope, clazz_ids_subquery, count_only = false)
scope = scope
.joins("INNER JOIN portal_teacher_clazzes ptc2 ON portal_offerings.clazz_id = ptc2.clazz_id")
.where(portal_teacher_clazzes: { clazz_id: clazz_ids_subquery })
.distinct
.select("external_activities.id, external_activities.name as label")

if count_only
scope.count("external_activities.id")
else
scope
.select("external_activities.id, external_activities.name as label")
.order("label")
end
end

def classes_query(options, user, scope, ids)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,17 @@ export default class ResearcherClassesForm extends React.Component {
queryCache[cacheKey] = data
this.setState(prevState => {
const hits = data.hits
const totals = data.totals
const newState = {}
if (!_fieldName) {
if (totals) {
newState.stats = {
cohorts: hits.cohorts.length,
teachers: hits.teachers.length,
runnables: hits.runnables.length,
classes: hits.classes.length
cohorts: totals.cohorts,
teachers: totals.teachers,
runnables: totals.runnables,
classes: totals.classes
}
}
if (hits.classes) {
newState.classes = hits.classes
} else {
newState.filterables = { ...prevState.filterables }
Expand Down

0 comments on commit ebb5770

Please sign in to comment.