Class: MySQLExpectations::Key

Inherits:
Object
  • Object
show all
Defined in:
lib/mysql_expectations/key.rb

Overview

An table key has a name and a sequence of index fields.

Constant Summary collapse

UNIQUE =
true
NON_UNIQUE =
false

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, unique = nil, fields) ⇒ Key

Returns a new instance of Key.



16
17
18
19
20
21
22
23
24
# File 'lib/mysql_expectations/key.rb', line 16

def initialize(name, unique = nil, fields)
  @name = name
  @unique = unique
  @fields = []
  fields.each do |field|
    field = KeyField.new(field) unless field.instance_of?(KeyField)
    @fields << field
  end
end

Instance Attribute Details

#fieldsObject (readonly)

Returns the value of attribute fields.



11
12
13
# File 'lib/mysql_expectations/key.rb', line 11

def fields
  @fields
end

#nameObject (readonly)

Returns the value of attribute name.



11
12
13
# File 'lib/mysql_expectations/key.rb', line 11

def name
  @name
end

#uniqueObject (readonly)

Returns the value of attribute unique.



11
12
13
# File 'lib/mysql_expectations/key.rb', line 11

def unique
  @unique
end

Class Method Details

.collation_from_s(collation) ⇒ Object



77
78
79
80
# File 'lib/mysql_expectations/key.rb', line 77

def self.collation_from_s(collation)
  return KeyField::ORDER_DESC if collation == 'D'
  KeyField::ORDER_ASC
end

.find_key_element(table_element, index_name, field_index) ⇒ Object



71
72
73
74
75
# File 'lib/mysql_expectations/key.rb', line 71

def self.find_key_element(table_element, index_name, field_index)
  query = "key[@Key_name='#{index_name}' and " \
    "@Seq_in_index='#{field_index + 1}']"
  table_element.elements[query]
end

.key?(table_element, key_name) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
# File 'lib/mysql_expectations/key.rb', line 46

def self.key?(table_element, key_name)
  result = table_element.elements["key[@Key_name='#{key_name}']"]
  !result.nil?
end

.load_all_keys(table_element) ⇒ Object



60
61
62
63
64
65
66
67
68
69
# File 'lib/mysql_expectations/key.rb', line 60

def self.load_all_keys(table_element)
  keys = {}
  table_element.elements.each('key') do |e|
    key_name = e.attributes['Key_name']
    unless keys.key? key_name
      keys[key_name] = load_key(table_element, key_name)
    end
  end
  keys.values
end

.load_key(table_element, key_name) ⇒ Object



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

def self.load_key(table_element, key_name)
  if key?(table_element, key_name)
    key_fields = load_key_fields(table_element, key_name)
    unique = load_uniqueness(table_element, key_name)
    return Key.new(key_name, unique, key_fields)
  end
  nil
end

.load_key_field(key_element) ⇒ Object



82
83
84
85
86
87
88
# File 'lib/mysql_expectations/key.rb', line 82

def self.load_key_field(key_element)
  name = key_element.attributes['Column_name']
  collation = key_element.attributes['Collation']
  collation = collation_from_s(collation)
  length = key_element.attributes['Length']
  KeyField.new(name, collation, length)
end

.load_key_fields(table_element, key_name) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/mysql_expectations/key.rb', line 96

def self.load_key_fields(table_element, key_name)
  key_fields = []
  (0..1000).each do |field_index|
    key_element = find_key_element(table_element, key_name, field_index)
    break if key_element.nil?
    key_fields << load_key_field(key_element)
  end
  key_fields
end

.load_uniqueness(table_element, key_name) ⇒ Object



90
91
92
93
94
# File 'lib/mysql_expectations/key.rb', line 90

def self.load_uniqueness(table_element, key_name)
  key_element = find_key_element(table_element, key_name, 0)
  return nil if key_element.nil?
  (key_element.attributes['Non_unique'] == '0')
end

Instance Method Details

#==(other) ⇒ Object



26
27
28
# File 'lib/mysql_expectations/key.rb', line 26

def ==(other)
  name == other.name && unique == other.unique && fields == other.fields
end

#to_sObject



30
31
32
33
34
35
36
37
38
# File 'lib/mysql_expectations/key.rb', line 30

def to_s
  result = "{ '#{name}', #{uniqueness_to_s}, ["
  fields.each_with_index do |field, index|
    result << ', ' if index > 0
    result << field.to_s
  end
  result << '] }'
  result
end

#uniqueness_to_sObject



40
41
42
43
44
# File 'lib/mysql_expectations/key.rb', line 40

def uniqueness_to_s
  return 'nil' if unique.nil?
  return 'UNIQUE' if unique == true
  return 'NON_UNIQUE' if unique == false
end