class Sequel::Postgres::JSONBOp

JSONBaseOp subclass for the jsonb type.

In the method documentation examples, assume that:

jsonb_op = Sequel.pg_jsonb(:jsonb)

Constants

CONCAT
CONTAINED_BY
CONTAINS
CONTAIN_ALL
CONTAIN_ANY
DELETE_PATH
HAS_KEY
PATH_EXISTS
PATH_MATCH

Public Instance Methods

-(other) click to toggle source

jsonb expression for deletion of the given argument from the current jsonb.

jsonb_op - "a" # (jsonb - 'a')
Calls superclass method
    # File lib/sequel/extensions/pg_json_ops.rb
597 def -(other)
598   self.class.new(super)
599 end
[](key) click to toggle source

Support subscript syntax for JSONB.

Calls superclass method Sequel::Postgres::JSONBaseOp#[]
    # File lib/sequel/extensions/pg_json_ops.rb
576 def [](key)
577   if is_array?(key)
578     super
579   else
580     case @value
581     when Symbol, SQL::Identifier, SQL::QualifiedIdentifier, JSONBSubscriptOp
582       # Only use subscripts for identifiers.  In other cases, switching from
583       # the -> operator to [] for subscripts causes SQL syntax issues.  You
584       # only need the [] for subscripting when doing assignment, and
585       # assignment is generally done on identifiers.
586       self.class.new(JSONBSubscriptOp.new(self, key))
587     else
588       super
589     end
590   end
591 end
concat(other) click to toggle source

jsonb expression for concatenation of the given jsonb into the current jsonb.

jsonb_op.concat(:h) # (jsonb || h)
    # File lib/sequel/extensions/pg_json_ops.rb
605 def concat(other)
606   json_op(CONCAT, wrap_input_jsonb(other))
607 end
contain_all(other) click to toggle source

Check if the receiver contains all of the keys in the given array:

jsonb_op.contain_all(:a) # (jsonb ?& a)
    # File lib/sequel/extensions/pg_json_ops.rb
612 def contain_all(other)
613   bool_op(CONTAIN_ALL, wrap_input_array(other))
614 end
contain_any(other) click to toggle source

Check if the receiver contains any of the keys in the given array:

jsonb_op.contain_any(:a) # (jsonb ?| a)
    # File lib/sequel/extensions/pg_json_ops.rb
619 def contain_any(other)
620   bool_op(CONTAIN_ANY, wrap_input_array(other))
621 end
contained_by(other) click to toggle source

Check if the other jsonb contains all entries in the receiver:

jsonb_op.contained_by(:h) # (jsonb <@ h)
    # File lib/sequel/extensions/pg_json_ops.rb
633 def contained_by(other)
634   bool_op(CONTAINED_BY, wrap_input_jsonb(other))
635 end
contains(other) click to toggle source

Check if the receiver contains all entries in the other jsonb:

jsonb_op.contains(:h) # (jsonb @> h)
    # File lib/sequel/extensions/pg_json_ops.rb
626 def contains(other)
627   bool_op(CONTAINS, wrap_input_jsonb(other))
628 end
delete_path(other) click to toggle source

Removes the given path from the receiver.

jsonb_op.delete_path(:h) # (jsonb #- h)
    # File lib/sequel/extensions/pg_json_ops.rb
640 def delete_path(other)
641   json_op(DELETE_PATH, wrap_input_array(other))
642 end
has_key?(key) click to toggle source

Check if the receiver contains the given key:

jsonb_op.has_key?('a') # (jsonb ? 'a')
    # File lib/sequel/extensions/pg_json_ops.rb
647 def has_key?(key)
648   bool_op(HAS_KEY, key)
649 end
Also aliased as: include?
include?(key)
Alias for: has_key?
insert(path, other, insert_after=false) click to toggle source

Inserts the given jsonb value at the given path in the receiver. The default is to insert the value before the given path, but insert_after can be set to true to insert it after the given path.

jsonb_op.insert(['a', 'b'], h) # jsonb_insert(jsonb, ARRAY['a', 'b'], h, false)
jsonb_op.insert(['a', 'b'], h, true) # jsonb_insert(jsonb, ARRAY['a', 'b'], h, true)
    # File lib/sequel/extensions/pg_json_ops.rb
658 def insert(path, other, insert_after=false)
659   self.class.new(function(:insert, wrap_input_array(path), wrap_input_jsonb(other), insert_after))
660 end
path_exists(path) click to toggle source

Returns whether the JSON path returns any item for the json object.

json_op.path_exists("$.foo") # (json @? '$.foo')
    # File lib/sequel/extensions/pg_json_ops.rb
665 def path_exists(path)
666   bool_op(PATH_EXISTS, path)
667 end
path_exists!(path, vars=nil, silent=nil) click to toggle source

Returns whether the JSON path returns any item for the json object.

json_op.path_exists!("$.foo")
# jsonb_path_exists(json, '$.foo')

json_op.path_exists!("$.foo ? ($ > $x)", x: 2)
# jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}')

json_op.path_exists!("$.foo ? ($ > $x)", {x: 2}, true)
# jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}', true)
    # File lib/sequel/extensions/pg_json_ops.rb
679 def path_exists!(path, vars=nil, silent=nil)
680   Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists, path, vars, silent))
681 end
path_exists_tz!(path, vars=nil, silent=nil) click to toggle source

The same as path_exists!, except that timezone-aware conversions are used for date/time values.

    # File lib/sequel/extensions/pg_json_ops.rb
684 def path_exists_tz!(path, vars=nil, silent=nil)
685   Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists_tz, path, vars, silent))
686 end
path_match(path) click to toggle source

Returns the first item of the result of JSON path predicate check for the json object. Returns nil if the first item is not true or false.

json_op.path_match("$.foo") # (json @@ '$.foo')
    # File lib/sequel/extensions/pg_json_ops.rb
692 def path_match(path)
693   bool_op(PATH_MATCH, path)
694 end
path_match!(path, vars=nil, silent=nil) click to toggle source

Returns the first item of the result of JSON path predicate check for the json object. Returns nil if the first item is not true or false and silent is true.

json_op.path_match!("$.foo")
# jsonb_path_match(json, '$.foo')

json_op.path_match!("$.foo ? ($ > $x)", x: 2)
# jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}')

json_op.path_match!("$.foo ? ($ > $x)", {x: 2}, true)
# jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}', true)
    # File lib/sequel/extensions/pg_json_ops.rb
707 def path_match!(path, vars=nil, silent=nil)
708   Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match, path, vars, silent))
709 end
path_match_tz!(path, vars=nil, silent=nil) click to toggle source

The same as path_match!, except that timezone-aware conversions are used for date/time values.

    # File lib/sequel/extensions/pg_json_ops.rb
712 def path_match_tz!(path, vars=nil, silent=nil)
713   Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match_tz, path, vars, silent))
714 end
path_query(path, vars=nil, silent=nil) click to toggle source

Returns a set of all jsonb values specified by the JSON path for the json object.

json_op.path_query("$.foo")
# jsonb_path_query(json, '$.foo')

json_op.path_query("$.foo ? ($ > $x)", x: 2)
# jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}')

json_op.path_query("$.foo ? ($ > $x)", {x: 2}, true)
# jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}', true)
    # File lib/sequel/extensions/pg_json_ops.rb
727 def path_query(path, vars=nil, silent=nil)
728   _path_function(:jsonb_path_query, path, vars, silent)
729 end
path_query_array(path, vars=nil, silent=nil) click to toggle source

Returns a jsonb array of all values specified by the JSON path for the json object.

json_op.path_query_array("$.foo")
# jsonb_path_query_array(json, '$.foo')

json_op.path_query_array("$.foo ? ($ > $x)", x: 2)
# jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}')

json_op.path_query_array("$.foo ? ($ > $x)", {x: 2}, true)
# jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}', true)
    # File lib/sequel/extensions/pg_json_ops.rb
747 def path_query_array(path, vars=nil, silent=nil)
748   JSONBOp.new(_path_function(:jsonb_path_query_array, path, vars, silent))
749 end
path_query_array_tz(path, vars=nil, silent=nil) click to toggle source

The same as path_query_array, except that timezone-aware conversions are used for date/time values.

    # File lib/sequel/extensions/pg_json_ops.rb
752 def path_query_array_tz(path, vars=nil, silent=nil)
753   JSONBOp.new(_path_function(:jsonb_path_query_array_tz, path, vars, silent))
754 end
path_query_first(path, vars=nil, silent=nil) click to toggle source

Returns the first item of the result specified by the JSON path for the json object.

json_op.path_query_first("$.foo")
# jsonb_path_query_first(json, '$.foo')

json_op.path_query_first("$.foo ? ($ > $x)", x: 2)
# jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}')

json_op.path_query_first("$.foo ? ($ > $x)", {x: 2}, true)
# jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}', true)
    # File lib/sequel/extensions/pg_json_ops.rb
767 def path_query_first(path, vars=nil, silent=nil)
768   JSONBOp.new(_path_function(:jsonb_path_query_first, path, vars, silent))
769 end
path_query_first_tz(path, vars=nil, silent=nil) click to toggle source

The same as path_query_first, except that timezone-aware conversions are used for date/time values.

    # File lib/sequel/extensions/pg_json_ops.rb
772 def path_query_first_tz(path, vars=nil, silent=nil)
773   JSONBOp.new(_path_function(:jsonb_path_query_first_tz, path, vars, silent))
774 end
path_query_tz(path, vars=nil, silent=nil) click to toggle source

The same as path_query, except that timezone-aware conversions are used for date/time values.

    # File lib/sequel/extensions/pg_json_ops.rb
732 def path_query_tz(path, vars=nil, silent=nil)
733   _path_function(:jsonb_path_query_tz, path, vars, silent)
734 end
pg_jsonb() click to toggle source

Return the receiver, since it is already a JSONBOp.

    # File lib/sequel/extensions/pg_json_ops.rb
777 def pg_jsonb
778   self
779 end
pretty() click to toggle source

Return a pretty printed version of the receiver as a string expression.

jsonb_op.pretty # jsonb_pretty(jsonb)
    # File lib/sequel/extensions/pg_json_ops.rb
784 def pretty
785   Sequel::SQL::StringExpression.new(:NOOP, function(:pretty))
786 end
set(path, other, create_missing=true) click to toggle source

Set the given jsonb value at the given path in the receiver. By default, this will create the value if it does not exist, but create_missing can be set to false to not create a new value.

jsonb_op.set(['a', 'b'], h) # jsonb_set(jsonb, ARRAY['a', 'b'], h, true)
jsonb_op.set(['a', 'b'], h, false) # jsonb_set(jsonb, ARRAY['a', 'b'], h, false)
    # File lib/sequel/extensions/pg_json_ops.rb
794 def set(path, other, create_missing=true)
795   self.class.new(function(:set, wrap_input_array(path), wrap_input_jsonb(other), create_missing))
796 end
set_lax(path, other, create_missing=true, null_value_treatment='use_json_null') click to toggle source

The same as set, except if other is nil, then behaves according to null_value_treatment, which can be one of ‘raise_exception’, ‘use_json_null’ (default), ‘delete_key’, or ‘return_target’.

    # File lib/sequel/extensions/pg_json_ops.rb
800 def set_lax(path, other, create_missing=true, null_value_treatment='use_json_null')
801   self.class.new(function(:set_lax, wrap_input_array(path), wrap_input_jsonb(other), create_missing, null_value_treatment))
802 end

Private Instance Methods

_path_function(func, path, vars, silent) click to toggle source

Internals of the jsonb SQL/JSON path functions.

    # File lib/sequel/extensions/pg_json_ops.rb
807 def _path_function(func, path, vars, silent)
808   args = []
809   if vars
810     if vars.is_a?(Hash)
811       vars = vars.to_json
812     end
813     args << vars
814 
815     unless silent.nil?
816       args << silent
817     end
818   end
819   SQL::Function.new(func, self, path, *args)
820 end
bool_op(str, other) click to toggle source

Return a placeholder literal with the given str and args, wrapped in a boolean expression, used by operators that return booleans.

    # File lib/sequel/extensions/pg_json_ops.rb
824 def bool_op(str, other)
825   Sequel::SQL::BooleanExpression.new(:NOOP, Sequel::SQL::PlaceholderLiteralString.new(str, [value, other]))
826 end
function_name(name) click to toggle source

The jsonb type functions are prefixed with jsonb_

    # File lib/sequel/extensions/pg_json_ops.rb
847 def function_name(name)
848   "jsonb_#{name}"
849 end
wrap_input_array(obj) click to toggle source

Wrap argument in a PGArray if it is an array

    # File lib/sequel/extensions/pg_json_ops.rb
829 def wrap_input_array(obj)
830   if obj.is_a?(Array) && Sequel.respond_to?(:pg_array) 
831     Sequel.pg_array(obj)
832   else
833     obj
834   end
835 end
wrap_input_jsonb(obj) click to toggle source

Wrap argument in a JSONBArray or JSONBHash if it is an array or hash.

    # File lib/sequel/extensions/pg_json_ops.rb
838 def wrap_input_jsonb(obj)
839   if Sequel.respond_to?(:pg_jsonb) && (obj.is_a?(Array) || obj.is_a?(Hash))
840     Sequel.pg_jsonb(obj)
841   else
842     obj
843   end
844 end