class Sequel::Postgres::JSONTableOp
Object representing json_table calls
Constants
- COLUMN_ON_SQL
- EXISTS_ON_ERROR_SQL
- TABLE_ON_ERROR_SQL
- WRAPPER
Public Class Methods
Source
# File lib/sequel/extensions/pg_json_ops.rb 1232 def initialize(expr, path, opts=OPTS, &block) 1233 @expr = expr 1234 @path = path 1235 @passing = opts[:passing] 1236 @on_error = opts[:on_error] 1237 @columns = opts[:_columns] || ColumnDSL.columns(&block) 1238 freeze 1239 end
See JSONBaseOp#table for documentation on the options.
Public Instance Methods
Source
# File lib/sequel/extensions/pg_json_ops.rb 1269 def sequel_ast_transform(transformer) 1270 opts = {:on_error=>@on_error, :_columns=>@columns} 1271 1272 if @passing 1273 passing = opts[:passing] = {} 1274 @passing.each do |k, v| 1275 passing[k] = transformer.call(v) 1276 end 1277 end 1278 1279 self.class.new(transformer.call(@expr), @path, opts) 1280 end
Support transforming of json_table expression
Source
# File lib/sequel/extensions/pg_json_ops.rb 1242 def to_s_append(ds, sql) 1243 sql << 'json_table(' 1244 ds.literal_append(sql, @expr) 1245 sql << ', ' 1246 default_literal_append(ds, sql, @path) 1247 1248 if (passing = @passing) && !passing.empty? 1249 sql << ' PASSING ' 1250 comma = false 1251 passing.each do |k, v| 1252 if comma 1253 sql << ', ' 1254 else 1255 comma = true 1256 end 1257 ds.literal_append(sql, v) 1258 sql << " AS " 1259 ds.send(:identifier_append, sql, k) 1260 end 1261 end 1262 1263 to_s_append_columns(ds, sql, @columns) 1264 sql << TABLE_ON_ERROR_SQL.fetch(@on_error) if @on_error 1265 sql << ')' 1266 end
Append the json_table function call expression to the SQL
Private Instance Methods
Source
# File lib/sequel/extensions/pg_json_ops.rb 1355 def default_literal_append(ds, sql, v) 1356 if sql.respond_to?(:skip_auto_param) 1357 sql.skip_auto_param do 1358 ds.literal_append(sql, v) 1359 end 1360 else 1361 ds.literal_append(sql, v) 1362 end 1363 end
Do not auto parameterize default value or path value, as PostgreSQL doesnβt allow it.
Source
# File lib/sequel/extensions/pg_json_ops.rb 1302 def to_s_append_column(ds, sql, column) 1303 case column[0] 1304 when :column 1305 _, name, type, opts = column 1306 ds.literal_append(sql, name) 1307 sql << ' ' << ds.db.send(:type_literal, opts.merge(:type=>type)).to_s 1308 sql << ' FORMAT JSON' if opts[:format] == :json 1309 to_s_append_path(ds, sql, opts[:path]) 1310 sql << WRAPPER.fetch(opts[:wrapper]) if opts[:wrapper] 1311 to_s_append_on_value(ds, sql, opts[:on_empty], " ON EMPTY") 1312 to_s_append_on_value(ds, sql, opts[:on_error], " ON ERROR") 1313 when :ordinality 1314 ds.literal_append(sql, column[1]) 1315 sql << ' FOR ORDINALITY' 1316 when :exists 1317 _, name, type, opts = column 1318 ds.literal_append(sql, name) 1319 sql << ' ' << ds.db.send(:type_literal, opts.merge(:type=>type)).to_s 1320 sql << ' EXISTS' 1321 to_s_append_path(ds, sql, opts[:path]) 1322 unless (on_error = opts[:on_error]).nil? 1323 sql << EXISTS_ON_ERROR_SQL.fetch(on_error) << " ON ERROR" 1324 end 1325 else # when :nested 1326 _, path, columns = column 1327 sql << 'NESTED ' 1328 default_literal_append(ds, sql, path) 1329 to_s_append_columns(ds, sql, columns) 1330 end 1331 end
Append the column information to the SQL. Handles the various types of json_table columns.
Source
# File lib/sequel/extensions/pg_json_ops.rb 1286 def to_s_append_columns(ds, sql, columns) 1287 sql << ' COLUMNS(' 1288 comma = nil 1289 columns.each do |column| 1290 if comma 1291 sql << comma 1292 else 1293 comma = ', ' 1294 end 1295 to_s_append_column(ds, sql, column) 1296 end 1297 sql << ')' 1298 end
Append the set of column information to the SQL. Separated to handle nested sets of columns.
Source
# File lib/sequel/extensions/pg_json_ops.rb 1334 def to_s_append_on_value(ds, sql, value, cond) 1335 if value 1336 if v = COLUMN_ON_SQL[value] 1337 sql << v 1338 else 1339 sql << ' DEFAULT ' 1340 default_literal_append(ds, sql, value) 1341 end 1342 sql << cond 1343 end 1344 end
Handle DEFAULT values in ON EMPTY/ON ERROR fragments
Source
# File lib/sequel/extensions/pg_json_ops.rb 1347 def to_s_append_path(ds, sql, path) 1348 if path 1349 sql << ' PATH ' 1350 default_literal_append(ds, sql, path) 1351 end 1352 end
Append path clause to the SQL