- Join DSL so that you can use arbitrary conditions when joining relations (flash-gordon)
You also can use table aliases, however the setup is a bit hairy:
users.join(tasks) { |users:, tasks:| tasks[:user_id].is(users[:id]) & users[:name].is('John') }
# self-join "users" with itself using "authors" as an alias authors = users.as(:authors).qualified(:authors) result = users.join(authors) { |users: | users[:id].is(authors[:id]) }.select(:name)
- Support for
CASE
expression (wmaciejak + flash-gordon)# matching expression result users.select_append { id.case(1 => string('one'), else: string('something else')).as(:one_or_else) } # searching for `true` result users.select_append { string::case(id.is(1) => 'one', else: 'else').as(:one_or_else) }
- Relations can be accessed in DSLs with keyword arguments (flash-gordon)
users.join(posts).select_append { |posts: | posts[:title] }
- Support for
.exists
in the projection DSL (flash-gordon)users.select_append { |posts: | exists(posts.where(posts[:user_id] => id)).as(:has_posts) }
Relation#unfiltered
returns an unrestricted relation (removes restrictions fromWHERE
andHAVING
) (flash-gordon)- Support for
WITHIN GROUP
in the function DSL has been enhanced with block syntax (flash-gordon)
# previously available version
households.project { fload::percentile_cont(0.5).within_group(income).as(:percentile) }
# using the new syntax
households.project { fload::percentile_cont(0.5).within_group { income }.as(:percentile) }
- Support for migrator options ie
ROM::Configuration.new(:sql, migrator: { path: "my_migrations" })
(rawburt)
- Support for subqueries in
SELECT
andWHERE
🎉 (flash-gordon)tasks = relations[:tasks] users = relations[:users] user_tasks = tasks.where(tasks[:user_id].is(users[:id]) tasks_count = user_tasks.select { int::count(id) } users.select_append(tasks_count.as(:tasks_count))
- Support for functions with
Any
return type (GustavoCaso) - New
Relation#as_hash
method (GustavoCaso)
- Command's
:timestamp
plugin now supports passing options (GustavoCaso) - Configuration supports hash with connection options (Kjarrigan + solnic)
- Aliased attributes are handled correctly in PG's commands (cflipse)
- Command extensions are properly applied in multi-adapter setups (solnic)
- Custom SQL-specific mapper compiler was added, which is used starting from rom-core 4.1.0 (solnic)
- Command's
:timestamp
plugin was removed, as it was moved to rom-core (GustavoCaso)
- Instrumentation works with all db interactions (not just queries that materialize relations) (solnic)
- Typo in
MissingEnv
exception message (romatr)
- Relation registry is passed as an argument to DSL blocks (in
select
,where
,order
etc.), which enables syntax likeselect { |r| [id, r.tasks[:title]] }
(solnic) - Support for self-referenced many-to-many associations (solnic)
- PG's geometric types include meta data about db types (GustavoCaso)
- Custom schema is used correctly in command results (solnic)
- Schemas no longer finalize PKs (this is done in core schema already) (solnic)
- Support for PG's range types (v-kolesnikov)
- Support for PG's
ltree
(GustavoCaso + solnic) - Support for the
FILTER
clause (flash-gordon) - PG's array types will use custom types for processing members ie
ltree[]
will useLTree
type (solnic)
- Schema inference works with primary keys that have custom types (ie an enum PK column) (v-kolesnikov)
- Ruby warnings are gone (solnic)
-
Support for schema plugins (flash-gordon)
-
Support for auto migrations (flash-gordon)
-
Add DLS for describing table indexes (flash-gordon)
schema do indexes do index :name, name: :unique_name, unique: true index :props, type: :gin index :name, name: :long_names_only, predicate: 'length(name) > 10' index :user_id, :title, name: :composite_idx end end
-
Support for composite indexes in the auto-restrictions plugin (flash-gordon)
-
SQL::Gateway#call
calls a SQL function (flash-gordon)gateway.(:upper, 'foo') # => "FOO" gateway.(:pg_advisory_xact_lock, 1234) # => nil
-
SQL::Gateway#run
executes a SQL string, e.g. a DDL statement (flash-gordon)gateway.run('set session IntervalStyle to default')
-
SQL::Relation#exists
joins a relation with theEXISTS
operator (flash-gordon)users.exists(posts) # => users with posts
-
Support for processing a relation in batches (flash-gordon)
users.each_batch(size: 100) do |rel| rel. command(:update). call(name: users[:first_name].concat(users[:last_name]) end
-
SQL::Relation#import
inserts data from another relation using theINSERT ... AS SELECT
syntax which is often far more effective than row-by-row processing and an ordinary multi-insert. Relations defined on another gateway are also supported, and in this case, the implementation falls back to the multi-insert strategy (flash-gordon)users.import(authors.select { first_name.concat(last_name).as(:name) })
-
Support for
tinytext
,text
,mediumtext
, and `longtext data types in MySQL (panthomakos) -
The new
pg_explain
plugin for getting query plans on PostgreSQL (flash-gordon)users.by_pk(1).explain(format: :json, analyze: true)
-
Support for window function calls
employees.select { [dep_no, salary, int::avg(salary).over(partition: dep_no, order: id).as(:avg_salary)] }
-
Function result can be negated, also
ROM::SQL::Function#not
was added (flash-gordon)users.where { !lower(name).is('John') } users.where { lower(name).not('John') }
- [BREAKING] based on rom 4.0 now (flash-gordon + solnic)
- [BREAKING]
Associates
command plugin requires associations now (solnic) - [BREAKING]
Command#transaction
is gone in favor ofRelation#transaction
(solnic) - [BREAKING]
PG::JSONArray
,PG::JSONBArray
,PG::JSONHash
, andPG::JSONBHash
types were dropped, usePG::JSON
andPG::JSONB
instead (flash-gordon) - [BREAKING] The
pg_hstore
extension now doesn't get loaded automatically, use the:extension
option to load it on config initialization (flash-gordon) ManyToOne
no longer uses a join (solnic)AutoCombine
andAutoWrap
plugins were removed as this functionality is provided by core API (solnic)- Foreign keys are indexed by default (flash-gordon)
- Schemas are qualified by default (solnic)
PG::JSON
,PG::JSONB
, andPG::Array
now all have read types so that they return plain Hash/Array values instead of Sequel's wrappers (flash-gordon)
- Self-ref associations work correctly with custom FKs (solnic)
- Aliased associations with custom FKs work correctly (solnic)
- Defining a custom dataset block no longer prevents default views like
by_pk
to be defined (solnic) Relation#group
uses canonical schema now (solnic)
-
Relation#lock
, row-level locking using theSELECT FOR UPDATE
clause (flash-gordon) -
get
andget_text
methods for thePG::JSON
type (flash-gordon) -
Support for converting data type with
CAST
using the function DSL (flash-gordon)users.select { string::cast(id, 'varchar').as(:id_str) }
-
Support for
EXISTS
(v-kolesnikov)subquery = tasks.where(tasks[:user_id].qualified => users[:id].qualified) users.where { exists(subquery) }
- Fixed a regression introduced in v1.3.2 caused by doing way more work processing the default dataset (flash-gordon)
- Support for filtering with a SQL function in the
WHERE
clause. Be sure you're using it wisely and don't call it on large datasets ;) (flash-gordon) Void
type for calling functions without returning value (flash-gordon)- Support for
PG::Array
transformations and queries (flash-gordon)
- A bunch of warnings from Sequel 4.46
- [internal] Compatibility with
dry-core
v0.3.0 (flash-gordon)
- New
Relation#exist?
predicate checks if the relation has at least one tuple (flash-gordon) - Support for JSONB transformations and queries using native DSL (flash-gordon)
- Add
ROM::SQL::Attribute#not
for negated boolean equality expressions (AMHOL) - Add
ROM::SQL::Attribute#!
for negated attribute's sql expressions (solnic) - Inferrer gets limit constraints for string data types and stores them in type's meta (v-kolesnikov)
- Fixed usage of PostgreSQL's commands with a composite relation (flash-gordon)
- Translation of
true/false/nil
equality checks tois/is not
SQL statements inROM::SQL::Attribute#is
(AMHOL) associates
command plugin coerces parent collections to hashes correctly (aarek+solnic)by_pk
works correctly even when PK is not projected (solnic)
-
Global private interface
SQL::Gateway.instance
has been deprecated. Now if you run migrations with ROM you should set up a ROM config in thedb:setup
task with something similar tonamespace :db task :setup do ROM::SQL::RakeSupport.env = ROM::Configuration.new(:sql, ENV['DATABASE_URL']) end end
- Updated
dry-initializer
(flash-gordon)
- Allow for joining by a
RelationProxy
instance fromrom-repository
(davydovanton)
- Support for configuring multiple associations for a command (solnic)
- Support for passing parent tuple(s) as
parent
option inCommand#with_association
(solnic) - Support for join using assocation name (flash-gordon)
- Fix grouping by a function in the block DSL (flash-gordon)
- Restriction conditions with an array as a value are handled correctly by attribute types (solnic)
- Added inferring for database indices (flash-gordon)
- Restriction conditions are now coerced using schema attributes (solnic)
:instrumentation
relation plugin that can be configured with any instrumentation backend (solnic):auto_restrictions
relation plugin, which definesby_*
views restricting relations by their indexed attributes (solnic)
- Missing
group
method was added to legacySequelAPI
module (solnic) - Associations properly maintain
order
if it was set (solnic)
AutoCombine#preload
uses better restriction forManyToOne
association which greatly speeds up loading bigger amounts of data (solnic + flash-gordon)
- Fix the usage of timestamp in command chains (cflipse)
- Support for selecting literal strings via
select { `'foo'`.as(:bar) }
(solnic)
- Support for inferring the PostgreSQL
hstore
data type (flash-gordon) - Support for the rest of geometric PostgreSQL data types (box, lseg, polygon, etc.) (Morozzzko)
- Added inferring for timestamp types with specified precision (flash-gordon)
- Added
ROM::SQL::Attribute#in
to support range checks in conditions (flash-gordon)
- Missing primary key now leads to a more meaningful error (flash-gordon)
This release is based on rom core 3.0.0 with its improved Schema API, which is extended with SQL-specific features.
Please refer to the upgrading guide if you're moving from 0.9.x to 1.0.0.
- [BREAKING] All relations have schemas (inferred by default, but still possible to override and/or extend) (solnic)
- [BREAKING] Schemas are used when defining relation views (solnic)
- [BREAKING] Default dataset is set up based on schema (solnic)
- Extended query API with support for schema attributes (solnic)
- Schemas can project relations automatically (solnic)
- New
Schema#qualified
(solnic) - New
Relation#assoc
method which is a shortcut for accessing relation created by the given association (solnic) - Schema attribute types are now SQL-specific and compatible with query DSL (ie you can pass relation attributes to
select
and they will be automatically converted to valid SQL expressions) (solnic) - Associations support setting custom
view
that will be used to extend association relation (solnic) - Associations support setting custom
foreign_key
names (solnic) - Update commands has
:associates
plugin enabled (solnic) - Support for self-referencing associations (ie categories have_many child categories) (solnic)
- Inferrers for mysql and sqlite were added (flash-gordon)
- PG's auto-inferrer can handle
inet
/cidr
/point
data types in a two-way manner, i.e. converting them back and forth on reading and writing (flash-gordon) - Support for inferring more PG types:
macaddr
,xml
(flash-gordon) ROM::SQL::Relation::SequelAPI
extension for backward-compatible query API (this will be deprecated in 1.1.0 and removed in 2.0.0) (solnic)- Added
Object
type forSQLite
which is used by the inferrer for columns without a type affinity (flash-gordon) - Support for composite PKs in the default
by_pk
view (solnic)
- [BREAKING]
Relation#header
has been removed in favor of schemas (solnic) - [BREAKING]
Relation#base
has been removed as now a vanilla relation is a base relation view (solnic) - [BREAKING] Deprecated
Relation.primary_key
has been removed in favor of schema (solnic) - [BREAKING] Deprecated
Commands::Update#change
has been removed (solnic) - [BREAKING] Deprecated
Commands.validator
has been removed (solnic) - [BREAKING]
assoc_macros
plugin has been removed, please use associations from now (solnic) - Default
by_pk
uses schema attributes, it will raise exception if PK attribute is missing in the schema (solnic) - [internal] Associations use schemas for relation projections (solnic)
- [internal]
select
,select_append
,project
,inner_join
andleft_join
use schemas internally (solnic) - [internal] Deprecation and constants are now based on dry-core (flash-gordon)
- Support for PG enums in schema inferrer (flash-gordon)
ROM::SQL::Relation#read
method which accepts an SQL string and returns a new relation (solnic)
Associations::{OneToMany,OneToOne}#associate
for merging FKs into child tuple (jodosha)- Added support for PostgreSQL types: UUID, Array, JSONB and Money (jodosha)
- Support for DB specific schema inferrers (flash-gordon)
- Automatically infer PG arrays and JSON(B) types (jodosha + flash-gordon)
- Support for
Relation#having
(cflipse)
- Inferred types in schemas are no longer strict (flash-gordon)
- PG-specific types are handled by
:postgres
extension and it loads connection extensions automatically (flash-gordon) - Make
OneToOne
inherit fromOneToMany
(beauby) - Default dataset will use column names from schema if it's available (solnic)
- Floats are inferred by schemas (cflipse)
- Support for relation schemas with SQL-specific data types (solnic + flash-gordon)
- One-To-Many support in schemas (solnic + flash-gordon)
- One-To-One support in schemas (solnic + flash-gordon)
- One-To-One-Through support in schemas (solnic + flash-gordon)
- Many-To-One support in schemas (solnic + flash-gordon)
- Many-To-Many support in schemas (solnic + flash-gordon)
- Support for
has_many
,has_one
andbelongs_to
convenient methods in schema DSL (solnic) - Support for custom PG types:
Types::PG::Array
,Types::PG::Hash
,Types::PG::JSON
, andTypes::PG::Bytea
(solnic + flash-gordon) - Optional automatic schema inference for attributes and foreign keys based on DB metadata provided by Sequel (flash-gordon)
- Support for arbitrary dataset and FK names in schemas (flash-gordon)
- Support for native upserts in PostgreSQL >= 9.5 via
Commands::Postgres::Upsert
(gotar + flash-gordon)
Create
andUpdate
commands have:schema
plugin enabled by default which sets input handler based on schema definition automatically (solnic)associates
command plugin uses schema associations now (solnic)- Dropped MRI 2.0.x support
Create
command properly materialize result when:one
is set (AMHOL)
- Repository plugins have been imported:
view
allows defining a relation view with an explicit header (solnic)base_view
defines a base view with all column names as the header (solnic)auto_combine
defines a genericfor_combine
method which eager-loads parent/children relation (solnic)auto-wrap
defines a genericfor_wrap
method which inner-joins a parent/children relation (solnic)
- Possibility to check for pending migrations (gotar)
Relation#sum
interface (gotar)Relation#avg
interface (gotar)Relation#min
interface (gotar)Relation#max
interface (gotar)Relation#union
interface (spscream)primary_key
macro which allows setting a custom primary key when it cannot be inferred automatically (solnic)
ROM::SQL.gateway
renamed toROM::SQL::Gateway.instance
for migrations (endash)- Association macros are now an optional plugin (solnic)
Gateway
accepts:extensions
as an option (c0)
Internal updates to fix deprecation warnings from ROM 0.9.0.
Relation#multi_insert
(draxxxeus)
- Command that receives many tuples will use
multi_insert
now (draxxxeus)
- Relation name and join key fixes for
many_to_one
macro (jamesmoriarty)
Relation#invert
operation (nepalez)
- Migration tasks no longer require entire ROM env (solnic)
Repository
=>Gateway
rename for ROM 0.8.0 compatibility (solnic)
- Relations won't be finalized when table(s) is/are missing (solnic)
- Wrap errors when calling commands with
[]
-syntax (kwando)
- Association macros support addition
:on
option (solnic) associates
plugin forCreate
command (solnic)- Support for NotNullConstraintError (solnic)
- Support for UniqueConstraintConstraintError (solnic)
- Support for ForeignKeyConstraintError (solnic)
- Support for CheckConstraintError (solnic)
Commands::Update#original
supports objects coercible to_h now (solnic)
- [BREAKING] Constraint errors are no longer command errors which means
try
andtransaction
blocks will not catch them (solnic) Commands::Update#set
has been deprecated (solnic)Commands::Update#to
has been deprecated (solnic)
transaction
doesn't swallow errors now other than CommandError (solnic)
- Support for setting custom association name (solnic)
- Support for
:conditions
option in association definition (solnic) - Better error message when accessing undefined associations (pdswan)
- Correct
ROM::SQL::Plugin::Pagination::Pager#total_pages
when total is not evenly divisible by page size (larribas) association_join
behaves correctly when dataset is different than register_as (nepalez)
transaction
returns command failure objects when there was a rollback (solnic)
- Database error handling for update and delete commands (kwando + solnic)
- Migration interface as a repository plugin (gotar + solnic)
ROM::SQL::Relation
which explictly defines an interface on top of Sequel (solnic + mcls)- Postgres-specific Create and Update commands that support RETURNING (gotar + solnic)
Update#change
interface for skipping execution when there's no diff (solnic)- Experimental migration API using sequel/migrations (gotar)
- Pagination plugin (solnic)
- Allow reuse of established Sequel connections (splattael)
- Use ROM's own inflector which uses either ActiveSupport or Inflecto backends (mjtko)
- Indentation in Rails logger (morgoth)
- Checking tuple count in commands (solnic)
Adapter#disconnect
(solnic)- Support for extra connection options (solnic)
association_join
now uses Sequel'sgraph
interface which qualifies columns automatically (solnic)- Delete command returns deleted tuples (solnic)
- Command API (solnic)
- Support for ActiveSupport::Notifications with a log subscriber (solnic)
- New
ROM::SQL::Adapter#dataset?(name)
checking if a given table exists (solnic)
- Equalizer in header (solnic)
- minor refactor in adapter (solnic)
First release powered by Sequel