simple_query 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa6c4c630a5cd486970ce4ca43b444f082050924305cb20e835a861b32676275
4
- data.tar.gz: de8f1cc3758f4a65edbc4a1d4bbe1c5edde866d6016332d5b415c35d97423e7e
3
+ metadata.gz: 6aeb71d493d14743e43b8c9a37eed697f131db105ffc4dc0fa35dd0dd189255b
4
+ data.tar.gz: 82b1815e569f24a4c4da9e4cd727d95ad6c938403bd2b781eccfc39398cb264b
5
5
  SHA512:
6
- metadata.gz: c9fb69f0d5505926239e5dcc396dedb098f974b38a0a1d135ddeb50927de9b88b8dc0f0fb850a2ab2fe6b9e7ba9a4955738c36d4a1c0f974e507740fa00edb15
7
- data.tar.gz: e8acc149f25a8b898a04ec7ca5203f98898d88bff334700ff5e4b6e0bb538b56fb47edd0b92cb66fbd86ac89c3f98d7c48930f25e9870bb34208b0bbd2735c4f
6
+ metadata.gz: d422a6a3484d4242b6666bb6536f4828b666c0f16dd6a0c42104b12e3f077bd30e580dc9cf5eb4292ecbb1cd0eda218aabe29af6e221a86c3291fc116b62b856
7
+ data.tar.gz: cf6e7c8a7e198d1b5376053237d7bdfac59819e07571adb5656e859de9a3bb840dace69e2e600703b14a5ff01bfedbf448d1aadb471a3875874c7d390599878a
data/README.md CHANGED
@@ -54,11 +54,12 @@ User.simple_query.select(:name, :email).where(active: true).execute
54
54
  ```
55
55
 
56
56
  Query with join
57
+
58
+ SimpleQuery now supports **all major SQL join types** — including LEFT, RIGHT, and FULL — through the following DSL methods:
57
59
  ```ruby
58
60
  User.simple_query
59
- .select(:name, :email)
60
- .join(:users, :companies, foreign_key: :user_id, primary_key: :id)
61
- .where(Company.arel_table[:name].eq("TechCorp"))
61
+ .left_join(:users, :companies, foreign_key: :user_id, primary_key: :id)
62
+ .select("users.name", "companies.name")
62
63
  .execute
63
64
  ```
64
65
 
@@ -143,9 +144,13 @@ class User < ActiveRecord::Base
143
144
  where(admin: true)
144
145
  end
145
146
 
147
+ # Block-based scope with parameter
146
148
  simple_scope :by_name do |name|
147
149
  where(name: name)
148
150
  end
151
+
152
+ # Lambda-based scope with parameter
153
+ simple_scope :by_name, ->(name) { where(name: name) }
149
154
  end
150
155
  ```
151
156
  You can then chain these scopes seamlessly with the normal SimpleQuery DSL:
@@ -34,12 +34,24 @@ module SimpleQuery
34
34
  self
35
35
  end
36
36
 
37
- def join(table1, table2, foreign_key:, primary_key:)
38
- @joins.add(table1, table2, foreign_key: foreign_key, primary_key: primary_key)
37
+ def join(table1, table2, foreign_key:, primary_key:, type: :inner)
38
+ @joins.add(table1, table2, foreign_key: foreign_key, primary_key: primary_key, join_type: type)
39
39
  reset_query
40
40
  self
41
41
  end
42
42
 
43
+ def left_join(table1, table2, foreign_key:, primary_key:)
44
+ join(table1, table2, foreign_key: foreign_key, primary_key: primary_key, type: :left)
45
+ end
46
+
47
+ def right_join(table1, table2, foreign_key:, primary_key:)
48
+ join(table1, table2, foreign_key: foreign_key, primary_key: primary_key, type: :right)
49
+ end
50
+
51
+ def full_join(table1, table2, foreign_key:, primary_key:)
52
+ join(table1, table2, foreign_key: foreign_key, primary_key: primary_key, type: :full)
53
+ end
54
+
43
55
  def order(order_conditions)
44
56
  @orders.add(order_conditions)
45
57
  reset_query
@@ -8,20 +8,37 @@ module SimpleQuery
8
8
  @joins = []
9
9
  end
10
10
 
11
- def add(table1, table2, foreign_key:, primary_key:)
11
+ def add(table1, table2, foreign_key:, primary_key:, join_type: :inner)
12
12
  @joins << {
13
13
  table1: to_arel_table(table1),
14
14
  table2: to_arel_table(table2),
15
15
  foreign_key: foreign_key,
16
- primary_key: primary_key
16
+ primary_key: primary_key,
17
+ type: join_type
17
18
  }
18
19
  end
19
20
 
20
21
  def apply_to(query)
21
- @joins.each do |join|
22
- query.join(join[:table2])
23
- .on(join[:table2][join[:foreign_key]]
24
- .eq(join[:table1][join[:primary_key]]))
22
+ @joins.each do |join_def|
23
+ table1 = join_def[:table1]
24
+ table2 = join_def[:table2]
25
+ fk = join_def[:foreign_key]
26
+ pk = join_def[:primary_key]
27
+ type = join_def[:type]
28
+
29
+ join_class = case type
30
+ when :left
31
+ Arel::Nodes::OuterJoin
32
+ when :right
33
+ Arel::Nodes::RightOuterJoin
34
+ when :full
35
+ Arel::Nodes::FullOuterJoin
36
+ else
37
+ Arel::Nodes::InnerJoin
38
+ end
39
+
40
+ condition = table2[fk].eq(table1[pk])
41
+ query.join(table2, join_class).on(condition)
25
42
  end
26
43
  query
27
44
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleQuery
4
- VERSION = "0.3.1"
4
+ VERSION = "0.3.2"
5
5
  end
data/lib/simple_query.rb CHANGED
@@ -41,19 +41,13 @@ module SimpleQuery
41
41
  @_simple_scopes ||= {}
42
42
  end
43
43
 
44
- # A reusable scope that can be applied to a SimpleQuery::Builder instance
45
- # Example:
46
- # simple_scope :active do
47
- # where(active: true)
48
- # end
49
- #
50
- # Parameterized scope:
51
- # simple_scope :by_name do |name|
52
- # where(name: name)
53
- # end
54
- #
55
- def simple_scope(name, &block)
56
- _simple_scopes[name.to_sym] = block
44
+ def simple_scope(name, body = nil, &block)
45
+ raise ArgumentError, "Pass either a proc/lambda or a block, not both" if body && block_given?
46
+
47
+ scope_body = body || block
48
+ raise ArgumentError, "You must provide a block or a proc" unless scope_body
49
+
50
+ _simple_scopes[name.to_sym] = scope_body
57
51
  end
58
52
  end
59
53
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kholodniak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-27 00:00:00.000000000 Z
11
+ date: 2025-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord