ARel and Rails 2

52
ARel and Rails 2 Building fast queries Friday, 4 June 2010

Transcript of ARel and Rails 2

Page 1: ARel and Rails 2

ARel and Rails 2Building fast queries

Friday, 4 June 2010

Page 2: ARel and Rails 2

Friday, 4 June 2010

Page 3: ARel and Rails 2

Rails 3

Friday, 4 June 2010

Page 4: ARel and Rails 2

Rails 3Coming Soon (tm)

Friday, 4 June 2010

Page 5: ARel and Rails 2

Rails 3Coming Soon (tm)

Maybe RailsConf?

Friday, 4 June 2010

Page 6: ARel and Rails 2

Rails 3.1

Friday, 4 June 2010

Page 7: ARel and Rails 2

Friday, 4 June 2010

Page 8: ARel and Rails 2

Ruby on Rails

Friday, 4 June 2010

Page 9: ARel and Rails 2

Rails Conf

Friday, 4 June 2010

Page 10: ARel and Rails 2

?Friday, 4 June 2010

Page 11: ARel and Rails 2

Rails Conf

Friday, 4 June 2010

Page 12: ARel and Rails 2

Friday, 4 June 2010

Page 13: ARel and Rails 2

Friday, 4 June 2010

Page 14: ARel and Rails 2

ARel and Rails 2

Friday, 4 June 2010

Page 15: ARel and Rails 2

User.find_by_sql(“<insanely complex SQL goes here>”)

Friday, 4 June 2010

Page 16: ARel and Rails 2

ARel

Friday, 4 June 2010

Page 17: ARel and Rails 2

Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)

Friday, 4 June 2010

Page 18: ARel and Rails 2

Table(:users)

Rails 2

Friday, 4 June 2010

Page 19: ARel and Rails 2

User

Rails 3

Friday, 4 June 2010

Page 20: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 21: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 22: ARel and Rails 2

eq

not_eqlt

lteqgt

gteq

in

not_matches

where

not_in

matches

Friday, 4 June 2010

Page 23: ARel and Rails 2

*_any *_all

Friday, 4 June 2010

Page 24: ARel and Rails 2

users = Table(:users)

Friday, 4 June 2010

Page 25: ARel and Rails 2

users.where(users[:first_name].eq_any(“Ryan”, “Bob”, “Alice”, “Etc.”))

any

Friday, 4 June 2010

Page 26: ARel and Rails 2

eq

users.where(users[:first_name].eq(“Ryan”))

Friday, 4 June 2010

Page 27: ARel and Rails 2

User.find_all_by_first_name(“Ryan”)

old skool

Friday, 4 June 2010

Page 28: ARel and Rails 2

Friday, 4 June 2010

Page 29: ARel and Rails 2

ryans = users.where(users[:first_name].eq(“Ryan”))ryans.where(users[:programmer].eq(true))

chainable

Friday, 4 June 2010

Page 30: ARel and Rails 2

in

users.where(emails[:sent_at].in((2.weeks.ago)..(1.week.ago))

Friday, 4 June 2010

Page 31: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 32: ARel and Rails 2

users.join(emails).on(emails[:user_id].eq(users[:id]).where(emails[:sent_at].lteq(2.weeks.ago))

joinlteq

Friday, 4 June 2010

Page 33: ARel and Rails 2

users.join(donations).on(donations[:user_id].eq(users[:id])). join(invites).on(invites[:id].eq(donations[:invite_id])). join(pushes).on(pushes[:id].eq(invites[:push_id])). join(campaigns).on(campaigns[:id].eq(pushes[:campaign_id])). where(campaigns[:id].eq(parameters[:campaign_id]))

super join

Friday, 4 June 2010

Page 34: ARel and Rails 2

users.join(donations).on(donations[:user_id].eq(users[:id])). join(invites).on(invites[:id].eq(donations[:invite_id])). join(pushes).on(pushes[:id].eq(invites[:push_id])). where(campaigns[:id].eq(parameters[:campaign_id])). join(campaigns).on(campaigns[:id].eq(pushes[:campaign_id]))

Friday, 4 June 2010

Page 35: ARel and Rails 2

Friday, 4 June 2010

Page 36: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 37: ARel and Rails 2

SELECT “users”.”id”, “users”.”username”, “users”.”email”, “users”.”first_name”, “users”.”last_name”, “users”.”title”, “users”.”company”, “users”.”alt_email”, “users”.”phone”, “users”.”mobile”, “users”.”aim”, “users”.”yahoo”, “users”.”google”, “users”.”skype”, “users”.”password_hash”, “users”.”password_salt”, “users”.”persistence_token”, “users”.”perishable_token”, “users”.”last_request_at”, “users”.”last_login_at”, “users”.”current_login_at”, “users”.”last_login_ip”, “users”.”current_login_ip”, “users”.”login_count”, “users”.”deleted_at”, “users”.”created_at”, “users”.”updated_at”, “users”.”admin”, “users”.”suspended_at”, “users”.”failed_login_count”, “users”.”facebook_email”, “users”.”facebook_uid”, “users”.”facebook_session_key”, “users”.”oauth_token”, “users”.”oauth_secret”, “users”.”twitter_uid”, “users”.”twitter_login”, “users”.”twitter_name”, “users”.”avatar_url”, “users”.”address”, “users”.”suburb”, “users”.”country”, “users”.”facebook_enabled_at”, “users”.”twitter_enabled_at”, “users”.”email_confirmed_at”, “users”.”postcode_id”, “users”.”state”, “users”.”gender”, “users”.”born_on”, “users”.”marital_status”, “users”.”industry_id”, “users”.”ethnicity_id”, “users”.”has_children”, “users”.”has_grandchildren”, “users”.”has_nesb”, “donations”.”id”, “donations”.”user_id”, “donations”.”amount_in_cents”, “donations”.”frequency”, “donations”.”payment_method”, “donations”.”cc_expiry_month”, “donations”.”cc_expiry_year”, “donations”.”created_at”, “donations”.”updated_at”, “donations”.”active”, “donations”.”last_donated_at”, “donations”.”cc_last_four_digits”, “donations”.”cc_name_on_card”, “donations”.”client_id”, “donations”.”invite_id”, “invites”.”id”, “invites”.”push_id”, “invites”.”name”, “invites”.”description”, “invites”.”launch_date”, “invites”.”status”, “invites”.”medium”, “invites”.”ask”, “invites”.”page_series”, “invites”.”pause_at_number”, “invites”.”number_sent”, “invites”.”opens”, “invites”.”clicks”, “invites”.”actions_taken”, “invites”.”revenue”, “invites”.”deleted_at”, “invites”.”created_at”, “invites”.”updated_at”, “invites”.”generation_id”, “invites”.”spam_reports”, “invites”.”bounces”, “invites”.”requests”, “invites”.”list_id”, “pushes”.”id”, “pushes”.”name”, “pushes”.”status”, “pushes”.”start_date”, “pushes”.”end_date”, “pushes”.”objective”, “pushes”.”target”, “pushes”.”budget”, “pushes”.”donations_target”, “pushes”.”members_target”, “pushes”.”opens_target”, “pushes”.”clicks_target”, “pushes”.”actions_target”, “pushes”.”created_at”, “pushes”.”updated_at”, “pushes”.”campaign_id”, “pushes”.”deleted_at”, “campaigns”.”id”, “campaigns”.”user_id”, “campaigns”.”assigned_to”, “campaigns”.”name”, “campaigns”.”access”, “campaigns”.”status”, “campaigns”.”budget”, “campaigns”.”revenue”, “campaigns”.”start_date”, “campaigns”.”end_date”, “campaigns”.”objective”, “campaigns”.”deleted_at”, “campaigns”.”created_at”, “campaigns”.”updated_at”, “campaigns”.”outcome”, “campaigns”.”target” FROM “users” INNER JOIN “donations” ON “donations”.”user_id” = “users”.”id” INNER JOIN “invites” ON “invites”.”id” = “donations”.”invite_id” INNER JOIN “pushes” ON “pushes”.”id” = “invites”.”push_id” INNER JOIN “campaigns” ON “campaigns”.”id” = “pushes”.”campaign_id” WHERE “campaigns”.”id” IS NULL

Friday, 4 June 2010

Page 38: ARel and Rails 2

SELECT users.* FROM “users” INNER JOIN “donations” ON “donations”.”user_id” = “users”.”id” INNER JOIN “invites” ON “invites”.”id” = “donations”.”invite_id” INNER JOIN “pushes” ON “pushes”.”id” = “invites”.”push_id” INNER JOIN “campaigns” ON “campaigns”.”id” = “pushes”.”campaign_id” WHERE “campaigns”.”id” IS NULL

Friday, 4 June 2010

Page 39: ARel and Rails 2

.project(“users.*”)

project

Friday, 4 June 2010

Page 40: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 41: ARel and Rails 2

users.order(users[:first_name])

order

users.order(users[:first_name].desc)

Friday, 4 June 2010

Page 42: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 43: ARel and Rails 2

users.take(5)

take

Friday, 4 June 2010

Page 44: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 45: ARel and Rails 2

users.skip(10).take(5)

skip

Friday, 4 June 2010

Page 46: ARel and Rails 2

where

join

project

order

take

skip

to_sql

Friday, 4 June 2010

Page 47: ARel and Rails 2

users.take(5).project(“*”).to_sql

"SELECT * FROM \"users\" LIMIT 5"

Friday, 4 June 2010

Page 48: ARel and Rails 2

User.find_by_sql(users.to_sql)

Finding?

Friday, 4 June 2010

Page 49: ARel and Rails 2

temporary_users = connection.select_values(sql)

temporary_users.uniq.flatten.map! do |user_ids| [self.id, user_ids].join(",")end.join("\n") query = "COPY lists_users(list_id, user_id) FROM STDIN WITH CSV"raw_connection.exec(query)raw_connection.put_copy_data(temporary_users)raw_connection.put_copy_end

Real world usage

Friday, 4 June 2010

Page 50: ARel and Rails 2

Custom SQL

users.order(“RANDOM()”)

users.where(“foo = bar”)

Friday, 4 June 2010

Page 51: ARel and Rails 2

Friday, 4 June 2010

Page 52: ARel and Rails 2

Done.

Friday, 4 June 2010