class ActiveFacts::Generators::Statistics

Generate a text verbalisation of the metamodel constellation created for an ActiveFacts vocabulary. Invoke as

afgen --text <file>.cql

Public Class Methods

new(vocabulary) click to toggle source
# File lib/activefacts/generators/stats.rb, line 17
def initialize(vocabulary)
  @vocabulary = vocabulary
  @vocabulary = @vocabulary.Vocabulary.values[0] if ActiveFacts::API::Constellation === @vocabulary
end

Public Instance Methods

generate(out = $>) click to toggle source
# File lib/activefacts/generators/stats.rb, line 23
def generate(out = $>)
  constellation = @vocabulary.constellation
  object_types = constellation.ObjectType.values
  fact_types = constellation.FactType.values

  # All metamodel object types:
  object_count = 0
  populated_object_type_count = 0
  fact_types_processed = {}
  fact_count = 0
  role_played_count = 0
  constellation.vocabulary.object_type.map do |object_type_name, object_type|
    objects = constellation.send(object_type_name)
    next unless objects.size > 0
    puts "\t#{object_type_name}: #{objects.size} instances (which play #{object_type.all_role.size} roles)"
    populated_object_type_count += 1
    object_count += objects.size

    #puts "#{object_type_name} has #{object_type.all_role.size} roles"
    object_type.all_role.each do |name, role|
      next unless role.unique
      next if fact_types_processed[role.fact_type]
      next if role.fact_type.is_a?(ActiveFacts::API::TypeInheritanceFactType)
      role_population_count =
        objects.values.inject(0) do |count, object|
          count += 1 if object.send(role.name) != nil
          count
        end
      puts "\t\t#{object_type_name}.#{role.name} has #{role_population_count} instances" if role_population_count > 0
      fact_count += role_population_count
      role_played_count += role_population_count*role.fact_type.all_role.size

      fact_types_processed[role.fact_type] = true
    end

  end
  puts "#{@vocabulary.name} has"
  puts "\t#{object_types.size} object types"
  puts "\t#{fact_types.size} fact types"
  puts "\tcompiles to #{object_count} objects in total, of #{populated_object_type_count} metamodel types"
  puts "\tcompiles to #{fact_count} facts in total, of #{fact_types_processed.size} metamodel fact types"
  puts "\tcompiles to #{role_played_count} role instances in total"
end