Class: Bmg::Keys

Inherits:
Object
  • Object
show all
Defined in:
lib/bmg/support/keys.rb

Instance Method Summary collapse

Constructor Details

#initialize(keys, reduce = false) ⇒ Keys

Returns a new instance of Keys.



4
5
6
# File 'lib/bmg/support/keys.rb', line 4

def initialize(keys, reduce = false)
  @keys = reduce ? reduce(keys) : keys
end

Instance Method Details

#allbut(oldtype, newtype, butlist) ⇒ Object



12
13
14
15
16
# File 'lib/bmg/support/keys.rb', line 12

def allbut(oldtype, newtype, butlist)
  keys = @keys.select{|k| (k & butlist).empty? }
  keys = [newtype.attrlist] if keys.empty?
  Keys.new(keys, false)
end

#autowrap(oldtype, newtype, options) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/bmg/support/keys.rb', line 18

def autowrap(oldtype, newtype, options)
  sep = options[:split] || Operator::Autowrap::DEFAULT_OPTIONS[:split]
  keys = @keys.map{|k|
    k.map{|a| a.to_s.split(sep).first }.uniq.map(&:to_sym)
  }
  Keys.new(keys, false)
end

#group(oldtype, newtype, attrs, as) ⇒ Object



26
27
28
29
30
# File 'lib/bmg/support/keys.rb', line 26

def group(oldtype, newtype, attrs, as)
  keys = [ oldtype.attrlist - attrs ]
  keys += @keys.map{|k| (k & attrs).empty? ? k : (k - attrs) + [as] }
  Keys.new(keys, true)
end

#join(oldtype, newtype, right_type, on) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/bmg/support/keys.rb', line 32

def join(oldtype, newtype, right_type, on)
  return nil  unless rkeys = right_type.keys
  return self if rkeys.any?{|k| (k - on).empty? }
  keys = []
  @keys.each do |k1|
    right_type.keys.each do |k2|
      keys << (k1 + k2).uniq
    end
  end
  Keys.new(keys, true)
end

#project(oldtype, newtype, attrlist) ⇒ Object



44
45
46
47
48
# File 'lib/bmg/support/keys.rb', line 44

def project(oldtype, newtype, attrlist)
  keys = @keys.select{|k| k.all?{|a| attrlist.include?(a) } }
  keys = [newtype.attrlist] if keys.empty?
  Keys.new(keys, false)
end

#rename(oldtype, newtype, renaming) ⇒ Object



50
51
52
53
# File 'lib/bmg/support/keys.rb', line 50

def rename(oldtype, newtype, renaming)
  keys = @keys.map{|k| k.map{|a| renaming[a] || a } }
  Keys.new(keys, false)
end

#to_aObject



64
65
66
# File 'lib/bmg/support/keys.rb', line 64

def to_a
  @keys
end

#union(oldtype, newtype, right_type) ⇒ Object



55
56
57
58
59
60
# File 'lib/bmg/support/keys.rb', line 55

def union(oldtype, newtype, right_type)
  return nil unless rkeys = right_type.keys
  return nil unless (oldtype.predicate & right_type.predicate).contradiction?
  shared = @keys.select{|k| rkeys.include?(k) }
  Keys.new(shared, false)
end