app/modules/vocabulary.rb

Summary

Maintainability
A
0 mins
Test Coverage
# This model contains functions which are solely used 
# for building the Vocabulary 
#
module Vocabulary
  class << self

    def usage_count context, meta_key_definition, meta_term, user
      MediaEntry.accessible_by_user(user,:view) 
        .joins(meta_data_meta_terms: {meta_terms: {meta_keys: :contexts}}) 
        .where("meta_key_definitions.id = ?", meta_key_definition.id) 
        .where("meta_terms.id = ?",meta_term.id) 
        .where("contexts.id= ?",context.id) 
        .limit(9999).count
    end

    def build_for_context_and_user context, user
      MetaKeyDefinition \
        .joins(:context).where("contexts.id= ?",context.id) 
        .joins(:meta_key).where("meta_datum_object_type = 'MetaDatumMetaTerms'")
        .order(:label).map{ |mkd|
          mkd.attributes.merge(
            meta_key_meta_terms_alphabetical_order: \
              MetaKey.find_by(id: mkd.meta_key_id).meta_terms_alphabetical_order,
            meta_terms: MetaTerm.joins(meta_keys: :meta_key_definitions) 
              .where("meta_key_definitions.id = ?",mkd.id)
              .order(:term).map{ |mt| 
                mt.attributes.symbolize_keys
                  .merge(usage_count: usage_count(context,mkd,mt,user))})}
        .map(&:deep_symbolize_keys)
    end

    # TODO remove duplication here
    def build_for_context_set_and_user context, set, user
      MetaKeyDefinition \
        .joins(:context).where("contexts.id= ?",context.id) 
        .joins(:meta_key).where("meta_datum_object_type = 'MetaDatumMetaTerms'")
        .order(:label).map{ |mkd|
          mkd.attributes.merge(
            meta_key_meta_terms_alphabetical_order: \
              MetaKey.find_by(id: mkd.meta_key_id).meta_terms_alphabetical_order,
            meta_terms: MetaTerm.joins(meta_keys: :meta_key_definitions) 
              .where("meta_terms.id in ( #{meta_terms_for_set(set).select('meta_terms.id').to_sql} )")
              .where("meta_key_definitions.id = ?",mkd.id)
              .order(:term).map{ |mt| 
                mt.attributes.symbolize_keys
                  .merge(usage_count: usage_count(context,mkd,mt,user))})}
        .map(&:deep_symbolize_keys)
    end

    def meta_terms_for_set set
      MetaTerm \
        .distinct
        .joins(%< 
          INNER JOIN meta_data_meta_terms AS mdmts ON mdmts.meta_term_id = meta_terms.id
          INNER JOIN meta_data ON meta_data.id = mdmts.meta_datum_id
          INNER JOIN media_resources AS entries ON entries.id = meta_data.media_resource_id
          INNER JOIN media_resource_arcs ON media_resource_arcs.child_id = entries.id
          INNER JOIN media_resources AS sets ON sets.id = media_resource_arcs.parent_id
          >)
        .where(%< entries.type = 'MediaEntry'>)
        .where(%< sets.id = ? >, set.id)
    end


    def media_entries context, user
      MediaEntry.accessible_by_user(user,:view) 
      .joins("INNER JOIN media_resource_arcs ON child_id = media_resources.id")
      .joins("INNER JOIN media_resources AS parents ON parent_id = parents.id")
      .joins("INNER JOIN media_sets_contexts ON media_set_id = parents.id")
      .joins("INNER JOIN contexts ON contexts.id= context_id")
      .where("contexts.id= ?",context.id)
    end

    def media_entries_count context, user
      media_entries(context,user).count
    end


  end
end