class Sequel::Postgres::JSONBaseOp
The JSONBaseOp
class is a simple container for a single object that defines methods that yield Sequel
expression objects representing PostgreSQL json operators and functions.
In the method documentation examples, assume that:
json_op = Sequel.pg_json(:json)
Constants
- GET
- GET_PATH
- GET_PATH_TEXT
- GET_TEXT
Public Instance Methods
Get JSON array element or object field as json. If an array is given, gets the object at the specified path.
json_op[1] # (json -> 1) json_op['a'] # (json -> 'a') json_op[%w'a b'] # (json #> ARRAY['a', 'b'])
# File lib/sequel/extensions/pg_json_ops.rb 110 def [](key) 111 if is_array?(key) 112 json_op(GET_PATH, wrap_array(key)) 113 else 114 json_op(GET, key) 115 end 116 end
Returns a set of json values for the elements in the json array.
json_op.array_elements # json_array_elements(json)
# File lib/sequel/extensions/pg_json_ops.rb 122 def array_elements 123 function(:array_elements) 124 end
Returns a set of text values for the elements in the json array.
json_op.array_elements_text # json_array_elements_text(json)
# File lib/sequel/extensions/pg_json_ops.rb 129 def array_elements_text 130 function(:array_elements_text) 131 end
Get the length of the outermost json array.
json_op.array_length # json_array_length(json)
# File lib/sequel/extensions/pg_json_ops.rb 136 def array_length 137 Sequel::SQL::NumericExpression.new(:NOOP, function(:array_length)) 138 end
Returns a set of key and value pairs, where the keys are text and the values are JSON.
json_op.each # json_each(json)
# File lib/sequel/extensions/pg_json_ops.rb 144 def each 145 function(:each) 146 end
Returns a set of key and value pairs, where the keys and values are both text.
json_op.each_text # json_each_text(json)
# File lib/sequel/extensions/pg_json_ops.rb 152 def each_text 153 function(:each_text) 154 end
Returns a json value for the object at the given path.
json_op.extract('a') # json_extract_path(json, 'a') json_op.extract('a', 'b') # json_extract_path(json, 'a', 'b')
# File lib/sequel/extensions/pg_json_ops.rb 160 def extract(*a) 161 self.class.new(function(:extract_path, *a)) 162 end
Returns a text value for the object at the given path.
json_op.extract_text('a') # json_extract_path_text(json, 'a') json_op.extract_text('a', 'b') # json_extract_path_text(json, 'a', 'b')
# File lib/sequel/extensions/pg_json_ops.rb 168 def extract_text(*a) 169 Sequel::SQL::StringExpression.new(:NOOP, function(:extract_path_text, *a)) 170 end
Get JSON array element or object field as text. If an array is given, gets the object at the specified path.
json_op.get_text(1) # (json ->> 1) json_op.get_text('a') # (json ->> 'a') json_op.get_text(%w'a b') # (json #>> ARRAY['a', 'b'])
# File lib/sequel/extensions/pg_json_ops.rb 178 def get_text(key) 179 if is_array?(key) 180 json_op(GET_PATH_TEXT, wrap_array(key)) 181 else 182 json_op(GET_TEXT, key) 183 end 184 end
Returns a set of keys AS text in the json object.
json_op.keys # json_object_keys(json)
# File lib/sequel/extensions/pg_json_ops.rb 189 def keys 190 function(:object_keys) 191 end
Expands the given argument using the columns in the json.
json_op.populate(arg) # json_populate_record(arg, json)
# File lib/sequel/extensions/pg_json_ops.rb 196 def populate(arg) 197 SQL::Function.new(function_name(:populate_record), arg, self) 198 end
Expands the given argument using the columns in the json.
json_op.populate_set(arg) # json_populate_recordset(arg, json)
# File lib/sequel/extensions/pg_json_ops.rb 203 def populate_set(arg) 204 SQL::Function.new(function_name(:populate_recordset), arg, self) 205 end
Returns a json value stripped of all internal null values.
json_op.strip_nulls # json_strip_nulls(json)
# File lib/sequel/extensions/pg_json_ops.rb 210 def strip_nulls 211 self.class.new(function(:strip_nulls)) 212 end
Builds arbitrary record from json object. You need to define the structure of the record using as
on the resulting object:
json_op.to_record.as(:x, [Sequel.lit('a integer'), Sequel.lit('b text')]) # json_to_record(json) AS x(a integer, b text)
# File lib/sequel/extensions/pg_json_ops.rb 218 def to_record 219 function(:to_record) 220 end
Builds arbitrary set of records from json array of objects. You need to define the structure of the records using as
on the resulting object:
json_op.to_recordset.as(:x, [Sequel.lit('a integer'), Sequel.lit('b text')]) # json_to_recordset(json) AS x(a integer, b text)
# File lib/sequel/extensions/pg_json_ops.rb 226 def to_recordset 227 function(:to_recordset) 228 end
Returns the type of the outermost json value as text.
json_op.typeof # json_typeof(json)
# File lib/sequel/extensions/pg_json_ops.rb 233 def typeof 234 function(:typeof) 235 end
Private Instance Methods
Return a function with the given name, and the receiver as the first argument, with any additional arguments given.
# File lib/sequel/extensions/pg_json_ops.rb 247 def function(name, *args) 248 SQL::Function.new(function_name(name), self, *args) 249 end
Whether the given object represents an array in PostgreSQL.
# File lib/sequel/extensions/pg_json_ops.rb 252 def is_array?(a) 253 a.is_a?(Array) || (defined?(PGArray) && a.is_a?(PGArray)) || (defined?(ArrayOp) && a.is_a?(ArrayOp)) 254 end
Automatically wrap argument in a PGArray
if it is a plain Array
. Requires that the pg_array extension has been loaded to work.
# File lib/sequel/extensions/pg_json_ops.rb 258 def wrap_array(arg) 259 if arg.instance_of?(Array) && Sequel.respond_to?(:pg_array) 260 Sequel.pg_array(arg) 261 else 262 arg 263 end 264 end