Sha256: 162ca7dccb1142b3e29b97e82b3bb421ba9491a23a25942dcc6e3f62ea02bacb

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 KB

Contents

module OData
  class Association
    
    attr_reader :name, :namespace, :relationship, :from_role, :to_role
    
    def initialize(nav_prop_element, edmx)
      @edmx = edmx

      # Get the edm namespace because it varies by version
      edm_ns = @edmx.xpath("edmx:Edmx/edmx:DataServices/*", "edmx" => "http://schemas.microsoft.com/ado/2007/06/edmx").first.namespaces['xmlns'].to_s
      @edmx_namespaces = { "edmx" => "http://schemas.microsoft.com/ado/2007/06/edmx", "edm" => edm_ns }
      parse_nav_prop(nav_prop_element)
    end
    
    private
    
    def parse_nav_prop(element)
      @relationship = element['Relationship']
      relationship_parts = @relationship.split('.')
      @name = relationship_parts.pop
      @namespace = relationship_parts.join('.')
      @from_role = role_hash(@name, element['FromRole'])
      @to_role = role_hash(@name, element['ToRole'])
    end
    
    def role_hash(association_name, role_name)
      # Find the end role based on the assocation name
      role_xpath = "/edmx:Edmx/edmx:DataServices/edm:Schema[@Namespace='#{@namespace}']/edm:Association[@Name='#{association_name}']/edm:End[@Role='#{role_name}']"
      role_element = @edmx.xpath(role_xpath, @edmx_namespaces).first
      { role_name => { 
          :edmx_type => "#{role_element['Type']}",
          :multiplicity => "#{role_element['Multiplicity']}"
      }}
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ruby_odata-0.1.0 lib/ruby_odata/association.rb