wowsql-sdk 1.1.0 → 1.2.0

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/wowsql/query_builder.rb +106 -13
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad880e2257d4f66eb09d166676bb673d10fdc77d40e8649d9d21dd752c5b116d
4
- data.tar.gz: f592669e6b04a84cee0c541447d1f7124e114386647c608c940af69b6c6fbe8b
3
+ metadata.gz: fea41521e87c3c13e013565585a0a6b28b08fc513a06ed322655882ffe06067e
4
+ data.tar.gz: 5e786bf298711641ef85070bdcf9a4809553bbeec58dbc23af95a36ead37b4d4
5
5
  SHA512:
6
- metadata.gz: 980b656e45ad73330ce5b87e6405013b00bc38a60a7d55ff33612c0157ae599a10721480cf018ba21903740e07c5d178d2b28b39591ea16704896fe39a3de258
7
- data.tar.gz: a621bd63b4f1c0c803dd5bf27216968aaba137b24d25a23473e290ca445eb4f9f24e50d72cfa8bf5cba442e03aa76be62add3d8e07d3177cc010d0ae0a3035c6
6
+ metadata.gz: 87bf0a5a1f4b5498b186bc6786153e249ca66b1b5788f18a3055c35c02f9edc7a8820560b57dc0c569b3cbf966943394150b3f4e3a5afed363c53ea22051c8cf
7
+ data.tar.gz: 69ca7517b578825d126b16e02cf78e2a7aff73a2d17393ee8b596668c1d21bb8c8dce3a8f80d49438e01b717d306c2a79e918c02b7b31fecfd83621b170ebe83
@@ -5,14 +5,15 @@ module WOWSQL
5
5
  @client = client
6
6
  @table_name = table_name
7
7
  @params = {}
8
+ @select_columns = nil
9
+ @filters = []
10
+ @group_by = nil
11
+ @having = []
12
+ @order_items = nil
8
13
  end
9
14
 
10
15
  def select(*columns)
11
- if columns.length == 1 && columns[0] == '*'
12
- @params['select'] = '*'
13
- else
14
- @params['select'] = columns.join(',')
15
- end
16
+ @select_columns = columns
16
17
  self
17
18
  end
18
19
 
@@ -52,7 +53,47 @@ module WOWSQL
52
53
  end
53
54
 
54
55
  def is_null(column)
55
- add_filter(column, 'is', nil)
56
+ @filters << { column: column, operator: 'is', value: nil, logical_op: 'AND' }
57
+ self
58
+ end
59
+
60
+ def in(column, values)
61
+ @filters << { column: column, operator: 'in', value: values, logical_op: 'AND' }
62
+ self
63
+ end
64
+
65
+ def not_in(column, values)
66
+ @filters << { column: column, operator: 'not_in', value: values, logical_op: 'AND' }
67
+ self
68
+ end
69
+
70
+ def between(column, min, max)
71
+ @filters << { column: column, operator: 'between', value: [min, max], logical_op: 'AND' }
72
+ self
73
+ end
74
+
75
+ def not_between(column, min, max)
76
+ @filters << { column: column, operator: 'not_between', value: [min, max], logical_op: 'AND' }
77
+ self
78
+ end
79
+
80
+ def or(column, operator, value)
81
+ @filters << { column: column, operator: operator, value: value, logical_op: 'OR' }
82
+ self
83
+ end
84
+
85
+ def group_by(*columns)
86
+ @group_by = columns
87
+ self
88
+ end
89
+
90
+ def having(column, operator, value)
91
+ @having << { column: column, operator: operator, value: value }
92
+ self
93
+ end
94
+
95
+ def order_by_multiple(*items)
96
+ @order_items = items
56
97
  self
57
98
  end
58
99
 
@@ -73,7 +114,22 @@ module WOWSQL
73
114
  end
74
115
 
75
116
  def get
76
- @client.request('GET', "/#{@table_name}", @params, nil)
117
+ # Check if we need POST endpoint (advanced features)
118
+ has_advanced_features =
119
+ (@group_by && !@group_by.empty?) ||
120
+ !@having.empty? ||
121
+ (@order_items && !@order_items.empty?) ||
122
+ @filters.any? { |f| ['in', 'not_in', 'between', 'not_between'].include?(f[:operator]) }
123
+
124
+ if has_advanced_features
125
+ # Use POST endpoint for advanced queries
126
+ body = build_query_body
127
+ @client.request('POST', "/#{@table_name}/query", nil, body)
128
+ else
129
+ # Use GET endpoint for simple queries (backward compatibility)
130
+ build_get_params
131
+ @client.request('GET', "/#{@table_name}", @params, nil)
132
+ end
77
133
  end
78
134
 
79
135
  def first
@@ -84,12 +140,49 @@ module WOWSQL
84
140
  private
85
141
 
86
142
  def add_filter(column, op, value)
87
- filter_value = "#{column}.#{op}.#{value || 'null'}"
88
-
89
- if @params['filter']
90
- @params['filter'] += ",#{filter_value}"
91
- else
92
- @params['filter'] = filter_value
143
+ @filters << { column: column, operator: op, value: value, logical_op: 'AND' }
144
+ end
145
+
146
+ def build_query_body
147
+ body = {}
148
+
149
+ body['select'] = @select_columns if @select_columns && !@select_columns.empty?
150
+
151
+ body['filters'] = @filters if !@filters.empty?
152
+
153
+ body['group_by'] = @group_by if @group_by && !@group_by.empty?
154
+
155
+ body['having'] = @having if !@having.empty?
156
+
157
+ if @order_items && !@order_items.empty?
158
+ body['order_by'] = @order_items.map do |item|
159
+ if item.is_a?(Hash)
160
+ item
161
+ else
162
+ { column: item[0], direction: item[1] }
163
+ end
164
+ end
165
+ elsif @params['order']
166
+ body['order_by'] = @params['order']
167
+ body['order_direction'] = @params['order_direction'] || 'asc'
168
+ end
169
+
170
+ body['limit'] = @params['limit'].to_i if @params['limit']
171
+ body['offset'] = @params['offset'].to_i if @params['offset']
172
+
173
+ body
174
+ end
175
+
176
+ def build_get_params
177
+ @params['select'] = @select_columns.join(',') if @select_columns && !@select_columns.empty?
178
+
179
+ simple_filters = @filters.reject { |f| ['in', 'not_in', 'between', 'not_between'].include?(f[:operator]) }
180
+ if !simple_filters.empty?
181
+ filter_strings = simple_filters.map do |f|
182
+ value_str = f[:value] || 'null'
183
+ "#{f[:column]}.#{f[:operator]}.#{value_str}"
184
+ end
185
+ @params['filter'] = filter_strings.join(',')
93
186
  end
94
187
  end
95
188
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wowsql-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - WOWSQL Team