lib/rubiks/nodes/level.rb in rubiks-0.0.4 vs lib/rubiks/nodes/level.rb in rubiks-0.0.5

- old
+ new

@@ -1,29 +1,133 @@ require 'rubiks/nodes/annotated_node' -require 'rubiks/nodes/hierarchy' module ::Rubiks class Level < ::Rubiks::AnnotatedNode + CARDINALITIES = %w[ low normal high ] + DATA_TYPES = %w[ String Integer Numeric Boolean Date Time Timestamp ] + + value :cardinality, String + value :contiguous_value, Fixnum + value :sort_column, String + value :data_type, String + value :column, String + value :name_column, String + + validates :cardinality_if_present, :data_type_if_present + def self.new_from_hash(hash={}) new_instance = new return new_instance.from_hash(hash) end def from_hash(working_hash) return self if working_hash.nil? working_hash.stringify_keys! parse_name(working_hash.delete('name')) + parse_name_column(working_hash.delete('name_column')) + parse_column(working_hash.delete('column')) + parse_data_type(working_hash.delete('data_type')) + parse_contiguous_value(working_hash.delete('contiguous')) + parse_cardinality(working_hash.delete('cardinality')) + parse_sort_column(working_hash.delete('sort')) + parse_sort_column(working_hash.delete('sorted')) + parse_sort_column(working_hash.delete('sort_column')) return self end + def parse_column(input_value) + return if input_value.nil? + + self.column = input_value.to_s + end + + def parse_name_column(input_value) + return if input_value.nil? + + self.name_column = input_value.to_s + end + + def parse_contiguous_value(input_value) + return if input_value.nil? + + self.contiguous_value = !!input_value ? 1 : 0 + end + + def parse_sort_column(sort_column_value) + return if sort_column_value.nil? + + if sort_column_value.kind_of?(::TrueClass) + self.sort_column = "#{self.name}_sort" + + elsif sort_column_value.kind_of?(::String) + self.sort_column = sort_column_value + end + end + + def data_type_if_present + if self.data_type.present? && !::Rubiks::Level::DATA_TYPES.include?(self.data_type) + errors << "DataType '#{self.data_type}' must be one of #{::Rubiks::Level::DATA_TYPES.join(', ')} on Level" + end + end + + def parse_data_type(data_type_value) + return if data_type_value.nil? + + self.data_type = data_type_value.to_s.capitalize + end + + def cardinality_if_present + if self.cardinality.present? && !::Rubiks::Level::CARDINALITIES.include?(self.cardinality) + errors << "Cardinality '#{self.cardinality}' must be one of #{::Rubiks::Level::CARDINALITIES.join(', ')} on Level" + end + end + + def parse_cardinality(cardinality_value) + return if cardinality_value.nil? + + self.cardinality = cardinality_value.to_s + end + def to_hash hash = {} - hash['name'] = self.name.to_s if self.name.present? + if self.name.present? + hash['name'] = self.name.to_s + hash['display_name'] = self.display_name + end + hash['contiguous'] = true if self.contiguous_value.present? && self.contiguous_value == 1 + hash['cardinality'] = self.cardinality if self.cardinality.present? + hash['data_type'] = self.data_type if self.data_type.present? + if self.column.present? + hash['column'] = self.column + elsif self.name.present? + hash['column'] = self.name + end + return hash + end + + def to_xml(builder = nil) + builder = Builder::XmlMarkup.new(:indent => 2) if builder.nil? + + attrs = {} + + if self.name.present? + attrs['name'] = self.display_name + attrs['column'] = self.column || self.name + end + attrs['type'] = self.data_type if self.data_type.present? + attrs['ordinalColumn'] = self.sort_column if self.sort_column.present? + attrs['nameColumn'] = self.name_column if self.name_column.present? + + builder.level(attrs) + end + + def to_json + MultiJson.dump(self.to_hash) end end end