Class | Sequel::Postgres::PGArray
In: | lib/sequel/extensions/pg_array_ops.rb lib/sequel/extensions/pg_array.rb
Parent: | Object

Represents a PostgreSQL array column value.

### Methods

new op register sql_literal_append

### Classes and Modules

Module Sequel::Postgres::PGArray::DatabaseMethods
Class Sequel::Postgres::PGArray::Creator
Class Sequel::Postgres::PGArray::JSONCreator
Class Sequel::Postgres::PGArray::Parser

### Constants

ARRAY | = | "ARRAY".freeze
DOUBLE_COLON | = | '::'.freeze
EMPTY_BRACKET | = | '[]'.freeze
OPEN_BRACKET | = | '['.freeze
CLOSE_BRACKET | = | ']'.freeze
COMMA | = | ','.freeze
BACKSLASH | = | '\\'.freeze
EMPTY_STRING | = | ''.freeze
OPEN_BRACE | = | '{'.freeze
CLOSE_BRACE | = | '}'.freeze
NULL | = | 'NULL'.freeze
QUOTE | = | '"'.freeze
ARRAY_TYPES | = | {} |  | Hash of database array type name strings to symbols (e.g. ‘double precision’ => :float), used by the schema parsing.

### Attributes

array_type | [RW] | The type of this array. May be nil if no type was given. If a type is provided, the array is automatically casted to this type when literalizing. This type is the underlying type, not the array type itself, so for an int4[] database type, it should be :int4 or ‘int4‘

### Public Class methods

new(array, type=nil)

Set the array to delegate to, and a database type.

[Source]

         # File lib/sequel/extensions/pg_array.rb, line 444
    444:       def initialize(array, type=nil)
    445:         super(array)
    446:         @array_type = type
    447:       end

register(db_type, opts={}, &block)

Registers an array type that the extension should handle. Makes a Database instance that has been extended with DatabaseMethods recognize the array type given and set up the appropriate typecasting. Also sets up automatic typecasting for the native postgres adapter, so that on retrieval, the values are automatically converted to PGArray instances. The db_type argument should be the exact database type used (as returned by the PostgreSQL format_type database function). Accepts the following options:

:array_type : | The type to automatically cast the array to when literalizing the array. Usually the same as db_type.
:converter : | A callable object (e.g. Proc), that is called with each element of the array (usually a string), and should return the appropriate typecasted object.
:oid : | The PostgreSQL OID for the array type. This is used by the Sequel postgres adapter to set up automatic type conversion on retrieval from the database.
:parser : | Can be set to :json to use the faster JSON-based parser. Note that the JSON-based parser can only correctly handle integers values correctly. It doesn‘t handle full precision for numeric types, and doesn‘t handle NaN/Infinity values for floating point types.
:scalar_oid : | Should be the PostgreSQL OID for the scalar version of this array type. If given, automatically sets the :converter option by looking for scalar conversion proc.
:scalar_typecast : | Should be a symbol indicating the typecast method that should be called on each element of the array, when a plain array is passed into a database typecast method. For example, for an array of integers, this could be set to :integer, so that the typecast_value_integer method is called on all of the array elements. Defaults to :type_symbol option.
:type_procs : | A hash mapping oids to conversion procs, used for looking up the :scalar_oid and value and setting the :oid value. Defaults to the global Sequel::Postgres::PG_TYPES.
:type_symbol : | The base of the schema type symbol for this type. For example, if you provide :integer, Sequel will recognize this type as :integer_array during schema parsing. Defaults to the db_type argument.
:typecast_method : | If given, specifies the :type_symbol option, but additionally causes no typecasting method to be created in the database. This should only be used to alias existing array types. For example, if there is an array type that can be treated just like an integer array, you can do :typecast_method=>:integer.
:typecast_methods_module : | If given, a module object to add the typecasting method to. Defaults to DatabaseMethods.

If a block is given, it is treated as the :converter option.

[Source]

         # File lib/sequel/extensions/pg_array.rb, line 157
    157:       def self.register(db_type, opts={}, &block)
    158:         db_type = db_type.to_s
    159:         typecast_method = opts[:typecast_method]
    160:         type = (typecast_method || opts[:type_symbol] || db_type).to_sym
    161:         type_procs = opts[:type_procs] || PG_TYPES
    162:         mod = opts[:typecast_methods_module] || DatabaseMethods
    163:
    164:         if converter = opts[:converter]
    165:           raise Error, "can't provide both a block and :converter option to register" if block
    166:         else
    167:           converter = block
    168:         end
    169:
    170:         if soid = opts[:scalar_oid]
    171:           raise Error, "can't provide both a converter and :scalar_oid option to register" if converter
    172:           raise Error, "no conversion proc for :scalar_oid=>#{soid.inspect}" unless converter = type_procs[soid]
    173:         end
    174:
    175:         array_type = (opts[:array_type] || db_type).to_s.dup.freeze
    176:         creator = (opts[:parser] == :json ? JSONCreator : Creator).new(array_type, converter)
    177:
    178:         ARRAY_TYPES[db_type] = "#{type}_array""#{type}_array"
    179:
    180:         define_array_typecast_method(mod, type, creator, opts.fetch(:scalar_typecast, type)) unless typecast_method
    181:
    182:         if oid = opts[:oid]
    183:           type_procs[oid] = creator
    184:         end
    185:
    186:         nil
    187:       end

### Public Instance methods

op()

Wrap the PGArray instance in an ArrayOp, allowing you to easily use the PostgreSQL array functions and operators with literal arrays.

[Source]

         # File lib/sequel/extensions/pg_array_ops.rb, line 221
    221:         def op
    222:           ArrayOp.new(self)
    223:         end

sql_literal_append(ds, sql)

Append the array SQL to the given sql string. If the receiver has a type, add a cast to the database array type.

[Source]

         # File lib/sequel/extensions/pg_array.rb, line 452
    452:       def sql_literal_append(ds, sql)
    453:         sql << ARRAY
    454:         _literal_append(sql, ds, to_a)
    455:         if at = array_type
    456:           sql << DOUBLE_COLON << at.to_s << EMPTY_BRACKET
    457:         end
    458:       end

[Validate]