Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ruby_odata / lib / ruby_odata / association.rb
Size: Mime:
module OData
  # Internal class used to represent object associations
  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