aliyun-log 0.2.10 → 0.2.11
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 +4 -4
- data/lib/aliyun/log.rb +1 -0
- data/lib/aliyun/log/record/persistence.rb +1 -0
- data/lib/aliyun/log/record/relation.rb +113 -21
- data/lib/aliyun/log/record/scoping.rb +4 -3
- data/lib/aliyun/log/record/type_casting.rb +22 -1
- data/lib/aliyun/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c29e47df03c69ea213e48e43e272714f950887b5ab8efaa60321e4506b4d4bd
|
4
|
+
data.tar.gz: fd5dcd273e40f70f93bd69e1fc9dbc392171d90c9881650503c420b18cf0cd5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a4a990ac42f07d0ce44fe018604a5af553f5d53a74cdb0b3abfd9a6b15f891f434bc3fada83afdae815c3bbf5477d72be9520f6926609ec356fe9aa8b6098d5
|
7
|
+
data.tar.gz: 0addf200ac1e5328fd5fbd4a459cf756a52f0b8ad1bc53f775676340147af385dc8758da2b7b0d63c8285b409820e4ab8778a822d0505172d554e12865ad7567
|
data/lib/aliyun/log.rb
CHANGED
@@ -35,14 +35,28 @@ module Aliyun
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def last(line = 1)
|
38
|
-
find_offset(0, line, true)
|
38
|
+
data = find_offset(0, line, true)
|
39
|
+
line > 1 ? data.reverse : data
|
39
40
|
end
|
40
41
|
|
41
42
|
def find_offset(nth, line = 1, reverse = false)
|
43
|
+
# @opts[:select] = '*'
|
42
44
|
@opts[:line] = line
|
43
45
|
@opts[:offset] = nth
|
44
|
-
@opts[:
|
45
|
-
|
46
|
+
if @opts[:order].present? && reverse
|
47
|
+
conds = []
|
48
|
+
@opts[:order].split(',').each do |field|
|
49
|
+
field.gsub!(/\s+desc|asc.*/i, '')
|
50
|
+
conds << "#{field.strip} DESC"
|
51
|
+
end
|
52
|
+
@opts[:order] = conds.join(', ')
|
53
|
+
end
|
54
|
+
@opts[:order] ||= reverse ? '__time__ DESC' : '__time__ ASC'
|
55
|
+
if @opts[:select].blank?
|
56
|
+
line <= 1 ? load[0] : load
|
57
|
+
else
|
58
|
+
line <= 1 ? result[0] : result
|
59
|
+
end
|
46
60
|
end
|
47
61
|
|
48
62
|
def scoping
|
@@ -78,10 +92,16 @@ module Aliyun
|
|
78
92
|
|
79
93
|
def page(val)
|
80
94
|
@opts[:page] = val - 1 if val >= 1
|
95
|
+
singleton_class.send(:define_method, :total_count) do
|
96
|
+
@total_count ||= count
|
97
|
+
end
|
98
|
+
singleton_class.send(:define_method, :total_pages) do
|
99
|
+
(total_count.to_f / (@opts[:line] || 100)).ceil
|
100
|
+
end
|
81
101
|
self
|
82
102
|
end
|
83
103
|
|
84
|
-
def
|
104
|
+
def api(opts)
|
85
105
|
@opts.merge!(opts)
|
86
106
|
self
|
87
107
|
end
|
@@ -101,33 +121,76 @@ module Aliyun
|
|
101
121
|
self
|
102
122
|
end
|
103
123
|
|
124
|
+
def where(*statement)
|
125
|
+
if statement[0].is_a?(String)
|
126
|
+
ql = sanitize_array(*statement)
|
127
|
+
@opts[:where] = ql
|
128
|
+
else
|
129
|
+
ql = statement_ql(*statement)
|
130
|
+
@opts[:search] = ql
|
131
|
+
end
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
135
|
+
def select(*fields)
|
136
|
+
@opts[:select] = fields.join(', ')
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
140
|
+
def group(*fields)
|
141
|
+
@opts[:group] = fields.join(', ')
|
142
|
+
self
|
143
|
+
end
|
144
|
+
|
145
|
+
def order(*fields)
|
146
|
+
if fields[0].is_a?(Hash)
|
147
|
+
@opts[:order] = fields[0].map do |k, v|
|
148
|
+
unless %w[asc desc].include?(v.to_s)
|
149
|
+
raise ArgumentError, "Direction \"#{v}\" is invalid. Valid directions are: [:asc, :desc, :ASC, :DESC]"
|
150
|
+
end
|
151
|
+
"#{k} #{v}"
|
152
|
+
end.join(', ')
|
153
|
+
else
|
154
|
+
@opts[:order] = fields.join(', ')
|
155
|
+
end
|
156
|
+
self
|
157
|
+
end
|
158
|
+
|
104
159
|
def query(opts = {})
|
105
160
|
@opts[:query] = opts
|
106
161
|
self
|
107
162
|
end
|
108
163
|
|
109
164
|
def count
|
165
|
+
# @opts[:select] = 'COUNT(*) as count'
|
166
|
+
_sql = to_sql
|
167
|
+
sql = "SELECT COUNT(*) as count"
|
168
|
+
sql += " FROM(#{_sql})" if _sql.present?
|
110
169
|
query = @opts.dup
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
170
|
+
query[:query] = "#{query[:search] || '*'}|#{sql}"
|
171
|
+
res = execute(query)
|
172
|
+
res.dig(0, 'count').to_i
|
173
|
+
end
|
174
|
+
|
175
|
+
def sum(field)
|
176
|
+
@opts[:select] = "SUM(#{field}) as sum"
|
177
|
+
query = @opts.dup
|
178
|
+
query[:query] = "#{query[:search] || '*'}|#{to_sql}"
|
179
|
+
res = execute(query)
|
180
|
+
res.dig(0, 'sum').to_f
|
119
181
|
end
|
120
182
|
|
121
183
|
def result
|
122
184
|
query = @opts.dup
|
123
|
-
if query[:page]
|
124
|
-
query[:line] ||= 100
|
125
|
-
query[:offset] = query[:page] * query[:line]
|
126
|
-
end
|
127
185
|
query[:query] = query[:search] || '*'
|
128
|
-
|
129
|
-
|
130
|
-
|
186
|
+
sql = to_sql
|
187
|
+
if sql.present?
|
188
|
+
query[:query] += "|#{sql}"
|
189
|
+
@opts[:line] = nil
|
190
|
+
@opts[:offset] = nil
|
191
|
+
@opts[:page] = nil
|
192
|
+
end
|
193
|
+
execute(query)
|
131
194
|
end
|
132
195
|
|
133
196
|
def load
|
@@ -140,8 +203,37 @@ module Aliyun
|
|
140
203
|
end
|
141
204
|
end
|
142
205
|
|
206
|
+
def to_sql
|
207
|
+
opts = @opts.dup
|
208
|
+
sql_query = []
|
209
|
+
sql_query << "WHERE #{opts[:where]}" if opts[:where].present?
|
210
|
+
sql_query << "GROUP BY #{opts[:group]}" if opts[:group].present?
|
211
|
+
sql_query << "ORDER BY #{opts[:order]}" if opts[:order].present?
|
212
|
+
if sql_query.present? || opts[:select].present?
|
213
|
+
sql_query.insert(0, "SELECT #{opts[:select] || '*'}")
|
214
|
+
sql_query.insert(1, 'FROM log')
|
215
|
+
if opts[:line] || opts[:page] || opts[:offset]
|
216
|
+
parse_page
|
217
|
+
sql_query << "LIMIT #{@opts[:offset]},#{@opts[:line]}"
|
218
|
+
end
|
219
|
+
end
|
220
|
+
"#{opts[:query]}#{sql_query.join(' ')}"
|
221
|
+
end
|
222
|
+
|
143
223
|
private
|
144
224
|
|
225
|
+
def execute(query)
|
226
|
+
puts query.slice(:from, :to, :search, :query).to_json
|
227
|
+
res = Log.record_connection.get_logs(@klass.project_name, @klass.logstore_name, query)
|
228
|
+
JSON.parse(res)
|
229
|
+
end
|
230
|
+
|
231
|
+
def parse_page
|
232
|
+
@opts[:line] ||= 100
|
233
|
+
@opts[:page] ||= 0
|
234
|
+
@opts[:offset] = @opts[:page] * @opts[:line]
|
235
|
+
end
|
236
|
+
|
145
237
|
def statement_ql(*statement)
|
146
238
|
if statement.size == 1
|
147
239
|
sanitize_hash(statement.first)
|
@@ -225,7 +317,7 @@ module Aliyun
|
|
225
317
|
end
|
226
318
|
|
227
319
|
def _quote(type, value)
|
228
|
-
v = TypeCasting.
|
320
|
+
v = TypeCasting.cast_field(value, cast_type: type || :string)
|
229
321
|
case type
|
230
322
|
when :string, nil then "'#{v.to_s}'"
|
231
323
|
when :bigdecimal then v.to_s("F")
|
@@ -239,7 +331,7 @@ module Aliyun
|
|
239
331
|
def _quote_type_value(value)
|
240
332
|
case value.class.name
|
241
333
|
when 'String' then "'#{value.to_s}'"
|
242
|
-
when 'BigDecimal'
|
334
|
+
when 'BigDecimal', 'Float' then value.to_s("F")
|
243
335
|
when 'Date', 'DateTime', 'Time' then "'#{value.iso8601}'"
|
244
336
|
else
|
245
337
|
value
|
@@ -10,9 +10,10 @@ module Aliyun
|
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
12
|
module ClassMethods
|
13
|
-
delegate :load, :result, :count, to: :all
|
14
|
-
delegate :where, :query, :search, :sql, :from, :to,
|
15
|
-
:page, :line, :limit, :offset,
|
13
|
+
delegate :load, :result, :count, :sum, to: :all
|
14
|
+
delegate :where, :query, :search, :sql, :from, :to, :api,
|
15
|
+
:page, :line, :limit, :offset, :select, :group,
|
16
|
+
:order, :to_sql, to: :all
|
16
17
|
delegate :first, :last, :second, :third, :fourth, :fifth, :find_offset, to: :all
|
17
18
|
|
18
19
|
def current_scope
|
@@ -9,7 +9,7 @@ module Aliyun
|
|
9
9
|
TYPE_MAPPING = {
|
10
10
|
text: :string,
|
11
11
|
long: :integer,
|
12
|
-
double: :
|
12
|
+
double: :float,
|
13
13
|
json: :json
|
14
14
|
}.freeze
|
15
15
|
|
@@ -148,6 +148,26 @@ module Aliyun
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
151
|
+
class FloatType < Value
|
152
|
+
def cast(value)
|
153
|
+
if value == true
|
154
|
+
1
|
155
|
+
elsif value == false
|
156
|
+
0
|
157
|
+
elsif value.is_a?(Symbol)
|
158
|
+
value.to_s.to_f
|
159
|
+
elsif value.is_a?(String) && value.blank?
|
160
|
+
nil
|
161
|
+
elsif value.is_a?(Float) && !value.finite?
|
162
|
+
nil
|
163
|
+
elsif !value.respond_to?(:to_f)
|
164
|
+
nil
|
165
|
+
else
|
166
|
+
value.to_f
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
151
171
|
class JsonType < Value
|
152
172
|
def cast(value)
|
153
173
|
return value unless value.is_a?(String)
|
@@ -183,6 +203,7 @@ module Aliyun
|
|
183
203
|
register(:datetime, DateTimeType)
|
184
204
|
register(:bigdecimal, BigDecimalType)
|
185
205
|
register(:integer, IntegerType)
|
206
|
+
register(:float, FloatType)
|
186
207
|
register(:json, JsonType)
|
187
208
|
end
|
188
209
|
end
|
data/lib/aliyun/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aliyun-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yingce Liu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|