module Sequel::SQL::StringAgg::DatasetMethods

  1. lib/sequel/extensions/string_agg.rb

These methods are added to datasets using the string_agg extension, for the purposes of correctly literalizing StringAgg expressions for the appropriate database type.

Methods

Public Instance

  1. string_agg_sql_append

Public Instance methods

string_agg_sql_append(sql, sa)

Append the SQL fragment for the StringAgg expression to the SQL query.

[show source]
    # File lib/sequel/extensions/string_agg.rb
 86 def string_agg_sql_append(sql, sa)
 87   if defined?(super)
 88     return super
 89   end
 90 
 91   expr = sa.expr
 92   separator = sa.separator || ","
 93   order = sa.order_expr
 94   distinct = sa.is_distinct?
 95 
 96   case db_type = db.database_type
 97   when :postgres, :sqlanywhere
 98     f = Function.new(db_type == :postgres ? :string_agg : :list, expr, separator)
 99     if order
100       f = f.order(*order)
101     end
102     if distinct
103       f = f.distinct
104     end
105     literal_append(sql, f)
106   when :mysql, :hsqldb, :h2
107     sql << "GROUP_CONCAT("
108     if distinct
109       sql << "DISTINCT "
110     end
111     literal_append(sql, expr)
112     if order
113       sql << " ORDER BY "
114       expression_list_append(sql, order)
115     end
116     sql << " SEPARATOR "
117     literal_append(sql, separator)
118     sql << ")"
119   when :oracle, :db2
120     if distinct
121       raise Error, "string_agg with distinct is not implemented on #{db.database_type}"
122     end
123     literal_append(sql, Function.new(:listagg, expr, separator))
124     if order
125       sql << " WITHIN GROUP (ORDER BY "
126       expression_list_append(sql, order)
127       sql << ")"
128     else
129       sql << " WITHIN GROUP (ORDER BY 1)"
130     end
131   else
132     raise Error, "string_agg is not implemented on #{db.database_type}"
133   end
134 end