Class: ActiveFacts::Metamodel::DataType

Inherits:
Object
  • Object
show all
Defined in:
lib/activefacts/metamodel/datatypes.rb

Defined Under Namespace

Classes: Context, DefaultContext

Constant Summary collapse

TypeNames =
%w{
  Boolean
  Integer Real Decimal Money
  Char String Text
  Date Time DateTime Timestamp
  Binary
}.freeze
AlternateNames =

Alternate names are case-insensitive, and underscore can be literal, or correspond to a space or to nothing

{
  TYPE_Boolean =>
    %w{ bit },
  TYPE_Integer =>
    %w{ auto_counter int tiny_int small_int big_int long_integer unsigned unsigned_int unsigned_integer signed_int signed_integer},
  TYPE_Real =>
    %w{ float double },
  TYPE_Decimal =>
    %w{ },
  TYPE_Money =>
    %w{ currency },
  TYPE_Char =>
    %w{ character nchar national_character fixed_length_text },
  TYPE_String =>
    %w{ varchar nvarchar national_character_varying variable_length_text },
  TYPE_Text =>
    %w{ large_length_text },
  TYPE_Date =>
    %w{ },
  TYPE_Time =>
    %w{ },
  TYPE_DateTime =>
    %w{ date_time },
  TYPE_Timestamp =>
    %w{ time_stamp auto_time_stamp },
  TYPE_Binary =>
    %w{ binary blob guid picture_raw_data variable_length_raw_data },
}
TypeParameters =
{
  TYPE_Integer => [:length],            # Length is the number of bits
  TYPE_Real => [:length],               # Length is the number of bits in the mantissa
  TYPE_Decimal => [:precision, :scale], # Precision is the number of significant digits
  TYPE_Money => [:precision, :scale],   # Precision is the number of significant digits. Scale is the digits of fractional cents.
  TYPE_Char => [:length, :charset],     # Charset is e.g. ascii, latin1, iso8859-1, unicode
  TYPE_String => [:length, :charset],
  TYPE_Text => [:charset],
  TYPE_Binary => [:length, :charset],
}

Class Method Summary collapse

Class Method Details

.choose_integer(type_name, length = nil, value_constraint = nil, context = DefaultContext.new) ⇒ Object

Integers are available in multiple sizes. Choose the most appropriate one.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/activefacts/metamodel/datatypes.rb', line 135

def self.choose_integer type_name, length = nil, value_constraint = nil, context = DefaultContext.new
  int_length = length || context.default_length(TYPE_Integer, type_name)
  if int_length
    if value_constraint
      # Pick out the largest maximum and smallest minimum from the ValueConstraint:
      ranges = value_constraint.all_allowed_range_sorted.flat_map{|ar| ar.value_range}
      min = ranges.map(&:minimum_bound).compact.map{|minb| minb.is_inclusive ? minb.value : minb.value-1}.map{|v| v.literal.to_i}.sort[0]
      max = ranges.map(&:maximum_bound).compact.map{|maxb| maxb.is_inclusive ? maxb.value : maxb.value+1}.map{|v| v.literal.to_i}.sort[-1]
    end

    unsigned = type_name =~ /^unsigned/i
    int_min = unsigned ? 0 : -2**(int_length-1)+1
    min = int_min if !min || length && int_min < min
    # SQL does not have unsigned types.
    # Don't force the next largest type just because the app calls for unsigned:
    int_max = unsigned ? 2**(int_length-1) - 1 : 2**(int_length-1)-1
    max = int_max if !max || length && int_max < max
  end
  best = context.choose_integer_range(min, max)
  unless best || length
    # Use the largest available integer size
    best = context.integer_ranges.last
  end

  # Use a context-defined integer size if one suits, otherwise the requested size:
  if best
    best[0]
  else
    nil   # No integer seems suitable
  end
end

.intrinsic_type(type_name) ⇒ Object



129
130
131
132
# File 'lib/activefacts/metamodel/datatypes.rb', line 129

def self.intrinsic_type type_name
  data_type, = type_mapping.detect{|t, names| names.detect{|n| n === type_name}}
  data_type
end