Class: Frodo::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/frodo/schema.rb,
lib/frodo/schema/enum_type.rb,
lib/frodo/schema/complex_type.rb

Defined Under Namespace

Classes: ComplexType, EnumType

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema_definition, service, navigation_properties = nil) ⇒ Schema

Creates a new schema.

Parameters:

  • schema_definition (Nokogiri::XML)

    The schema’s XML definition

  • service (Frodo::Service)

    The schema’s parent service



15
16
17
18
19
# File 'lib/frodo/schema.rb', line 15

def initialize(schema_definition, service, navigation_properties=nil)
  @metadata = schema_definition
  @service = service
  @navigation_properties = navigation_properties
end

Instance Attribute Details

#metadataObject (readonly)

The schema’s metadata (i.e its XML definition)



9
10
11
# File 'lib/frodo/schema.rb', line 9

def 
  @metadata
end

#serviceObject (readonly)

The schema’s parent service



7
8
9
# File 'lib/frodo/schema.rb', line 7

def service
  @service
end

Instance Method Details

#actionsArray<String>

Returns a list of actions defined by the schema.

Returns:

  • (Array<String>)


35
36
37
38
39
# File 'lib/frodo/schema.rb', line 35

def actions
  @actions ||= .xpath('//Action').map do |action|
    action.attributes['Name'].value
  end
end

#aliasString

Returns the schema’s ‘Alias` attribute.

Returns:

  • (String)


29
30
31
# File 'lib/frodo/schema.rb', line 29

def alias
  @alias ||= .attributes['Alias']&.value
end

#complex_typesHash<String, Frodo::Schema::ComplexType>

Returns a list of ‘ComplexType`s defined by the schema.

Returns:



51
52
53
54
55
56
57
58
# File 'lib/frodo/schema.rb', line 51

def complex_types
  @complex_types ||= .xpath('//ComplexType').map do |entity|
    [
      entity.attributes['Name'].value,
      ComplexType.new(entity, self)
    ]
  end.to_h
end

#entity_typesArray<String>

Returns a list of entities defined by the schema.

Returns:

  • (Array<String>)


43
44
45
46
47
# File 'lib/frodo/schema.rb', line 43

def entity_types
  @entity_types ||= .xpath('//EntityType').map do |entity|
    entity.attributes['Name'].value
  end
end

#enum_typesHash<String, Frodo::Schema::EnumType>

Returns a list of EnumTypes defined by the schema.

Returns:



62
63
64
65
66
67
68
69
# File 'lib/frodo/schema.rb', line 62

def enum_types
  @enum_types ||= .xpath('//EnumType').map do |entity|
    [
      entity.attributes['Name'].value,
      EnumType.new(entity, self)
    ]
  end.to_h
end

#functionsArray<String>

Returns a list of functions defined by the schema.

Returns:

  • (Array<String>)


73
74
75
76
77
# File 'lib/frodo/schema.rb', line 73

def functions
  @functions ||= .xpath('//Function').map do |function|
    function.attributes['Name'].value
  end
end

#get_property_type(entity_name, property_name) ⇒ String

Get the property type for an entity from metadata.

Parameters:

  • entity_name (to_s)

    the name of the relevant entity

  • property_name (to_s)

    the property name needed

Returns:

  • (String)

    the name of the property’s type



141
142
143
# File 'lib/frodo/schema.rb', line 141

def get_property_type(entity_name, property_name)
  .xpath("//EntityType[@Name='#{entity_name}']/Property[@Name='#{property_name}']").first.attributes['Type'].value
end

#namespaceString

Returns the schema’s ‘Namespace` attribute (mandatory).

Returns:

  • (String)


23
24
25
# File 'lib/frodo/schema.rb', line 23

def namespace
  @namespace ||= .attributes['Namespace'].value
end

Returns a hash for finding an association through an entity type’s defined NavigationProperty elements.

Returns:



90
91
92
93
94
95
96
97
98
# File 'lib/frodo/schema.rb', line 90

def navigation_properties
  @navigation_properties ||= .xpath('//EntityType').map do |entity_type_def|
    entity_name = entity_type_def.attributes['Name'].value
    [
      entity_name,
      navigation_properties_for_entity(entity_name)
    ]
  end.to_h
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Get the list of navigation properties and their various options for the supplied Entity name.

Parameters:

  • entity_name (to_s)

Returns:

  • (Hash)


105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/frodo/schema.rb', line 105

def navigation_properties_for_entity(entity_name)
  type_definition = get_type_definition_for_entity_name(entity_name)

  parent_properties = recurse_on_parent_type(type_definition)

  properties_to_return = type_definition.xpath('./NavigationProperty').map do |nav_property_def|
    [
      nav_property_def.attributes['Name'].value,
      ::Frodo::NavigationProperty.build(nav_property_def)
    ]
  end.to_h
  parent_properties.merge!(properties_to_return)
end

#primary_key_for(entity_name) ⇒ String

Get the primary key for the supplied Entity.

Parameters:

  • entity_name (to_s)

Returns:

  • (String)


149
150
151
# File 'lib/frodo/schema.rb', line 149

def primary_key_for(entity_name)
  .xpath("//EntityType[@Name='#{entity_name}']/Key/PropertyRef").first.attributes['Name'].value
end

#properties_for_entity(entity_name) ⇒ Hash

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Get the list of properties and their various options for the supplied Entity name.

Parameters:

  • entity_name (to_s)

Returns:

  • (Hash)


158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/frodo/schema.rb', line 158

def properties_for_entity(entity_name)
  type_definition = get_type_definition_for_entity_name(entity_name)
  properties_to_return = {}

  parent_properties = recurse_on_parent_type(type_definition)

  type_definition.xpath('./Property').each do |property_xml|
    property_name, property = process_property_from_xml(property_xml)
    properties_to_return[property_name] = property
  end
  parent_properties.merge!(properties_to_return)
end

#referential_constraints_for_entity(entity_name) ⇒ Object

Returns a hash for finding the associated read-only value property for a given navigation property



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/frodo/schema.rb', line 122

def referential_constraints_for_entity(entity_name)
  type_definition = get_type_definition_for_entity_name(entity_name)

  parent_refcons = recurse_on_parent_type(type_definition)

  refcons_to_return = type_definition.xpath('./NavigationProperty[ReferentialConstraint]').map do |nav_property_def|
    [
      nav_property_def.attributes['Name'].value,
      nav_property_def.xpath('./ReferentialConstraint').first.attributes['Property'].value
    ]
  end.to_h
  parent_refcons.merge!(refcons_to_return)
end

#type_definitionsArray<String>

Returns a list of type definitions defined by the schema.

Returns:

  • (Array<String>)


81
82
83
84
85
# File 'lib/frodo/schema.rb', line 81

def type_definitions
  @typedefs ||= .xpath('//TypeDefinition').map do |typedef|
    typedef.attributes['Name'].value
  end
end