These methods are added to datasets using the string_agg extension, for the purposes of correctly literalizing StringAgg
expressions for the appropriate database type.
Public Instance methods
string_agg_sql_append(sql, sa)
[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