Class: Alf::Tuple

Inherits:
Object
  • Object
show all
Defined in:
lib/alf-relation/alf/tuple.rb

Constant Summary collapse

EMPTY =
Tuple[{}].new({})
DUM =
EMPTY

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.heading_based_factoredObject



19
20
21
22
23
24
25
26
27
# File 'lib/alf-relation/alf/tuple.rb', line 19

def self.heading_based_factored
  heading.each do |attrname,attrtype|
    define_method(attrname) do |*args, &bl|
      return super(*args, &bl) unless args.empty? && bl.nil?
      reused_instance[attrname]
    end
  end
  self
end

Instance Method Details

#allbut(attr_list) ⇒ Object



55
56
57
# File 'lib/alf-relation/alf/tuple.rb', line 55

def allbut(attr_list)
  split(attr_list).last
end

#check_internal_representation!Object



29
30
31
32
33
34
35
36
# File 'lib/alf-relation/alf/tuple.rb', line 29

def check_internal_representation!
  error = lambda{|msg| raise TypeError, msg }
  error["Hash expected for representation"] unless reused_instance.is_a?(Hash)
  TypeCheck.new(heading, true).check!(reused_instance)
  self
rescue TypeCheck::Error => ex
  error[ex.message]
end

#extend(computation) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/alf-relation/alf/tuple.rb', line 64

def extend(computation)
  computation   = TupleComputation.coerce(computation)
  scope         = Support::TupleScope.new(self)
  computed      = computation.evaluate(scope)
  res_heading   = heading.merge(Heading.infer(computed))
  Tuple[res_heading].new(reused_instance.merge(computed))
end

#headingObject



38
39
40
# File 'lib/alf-relation/alf/tuple.rb', line 38

def heading
  self.class.heading
end

#merge(other) ⇒ Object



77
78
79
80
# File 'lib/alf-relation/alf/tuple.rb', line 77

def merge(other)
  res = reused_instance.merge(other.to_hash)
  Tuple[Heading.infer(res)].new(res)
end

#project(attr_list) ⇒ Object



51
52
53
# File 'lib/alf-relation/alf/tuple.rb', line 51

def project(attr_list)
  split(attr_list).first
end

#remap(&bl) ⇒ Object



72
73
74
75
# File 'lib/alf-relation/alf/tuple.rb', line 72

def remap(&bl)
  res = reused_instance.each_with_object({}){|(k,v),n| n[k] = bl[k, v]}
  Tuple[Heading.infer(res)].new(res)
end

#rename(renaming) ⇒ Object



59
60
61
62
# File 'lib/alf-relation/alf/tuple.rb', line 59

def rename(renaming)
  renaming = Renaming.coerce(renaming)
  self.class.rename(renaming).new(renaming.rename_tuple(reused_instance))
end

#split(attr_list) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/alf-relation/alf/tuple.rb', line 42

def split(attr_list)
  return [ EMPTY, self ] if attr_list.empty?
  left, right = {}, to_hash
  (heading.to_attr_list & attr_list).each do |a|
    left[a] = right.delete(a)
  end
  self.class.split(attr_list).zip([left, right]).map{|t,v| t.new(v) }
end

#to_attr_listObject



90
91
92
# File 'lib/alf-relation/alf/tuple.rb', line 90

def to_attr_list
  heading.to_attr_list
end

#to_hash(dup = true) ⇒ Object



82
83
84
# File 'lib/alf-relation/alf/tuple.rb', line 82

def to_hash(dup = true)
  dup ? reused_instance.dup : reused_instance
end

#to_json(*args, &bl) ⇒ Object



86
87
88
# File 'lib/alf-relation/alf/tuple.rb', line 86

def to_json(*args, &bl)
  to_hash.to_json(*args, &bl)
end

#to_ruby_literalObject Also known as: inspect, to_s



94
95
96
# File 'lib/alf-relation/alf/tuple.rb', line 94

def to_ruby_literal
  "Tuple(#{Support.to_ruby_literal(to_hash)})"
end