statlysis 0.0.7 → 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 09b1a9957e7a2b7e144bf0a63f88a6cac2f6aa7c
4
+ data.tar.gz: 987032aa739109073dca9d0ff45e593eb4703ef0
5
+ SHA512:
6
+ metadata.gz: ff32e0d21b51a3d0896ddfa95998a5215dc122ea44e70ecbf9b8582dd1b13c571eac553657da42ef88527e5fa9496c87e9fc10f7adfaa314c96999c9c0943b91
7
+ data.tar.gz: 03f3d2d734dea769a53ac40686cb7e6907e3852a1643e9dbfee8bb046805d85bb31bbf3052db60c72a61e8027b10ee3c0a4e7b72bde458da33a866c4af8e3199
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - 2.2.0
7
+ script: "rake"
@@ -1,7 +1,11 @@
1
- Statlysis
1
+ Statlysis [![Build Status](https://travis-ci.org/mvj3/statlysis.png)](https://travis-ci.org/mvj3/statlysis)
2
2
  ===============================================
3
3
  Statistical and analysis in Ruby DSL, just as simple as SQL operations in ActiveRecord.
4
4
 
5
+ Usage
6
+ -----------------------------------------------
7
+ 见下面的 [成功案例](#成功案例) 的配置文件 和 [手把手操作示例](http://mvj3.github.io/statlysis/showterm.html) 。
8
+
5
9
  项目来由,理念,和使用说明
6
10
  -----------------------------------------------
7
11
  该项目起因是为eoe.cn做一套统计后台,而其构思来自于2012上半年做 [Android优亿市场数据采集分析系统](http://mvj3.github.io/2012/11/01/android_eoemarket_data_collect_and_analysis_system_summary/) 时的一些经验和心得,在2013年上半年完成了架构和大部分代码,支持ActiveRecord和Mongoid两个ORM。下半年在阳光书屋加上了对Mongoid的MapReduce支持。
@@ -32,15 +36,17 @@ MongoDB作为NoSQL数据库,它是为 **单collection** 里读写 **单个记
32
36
  * eoe.cn各子网站的页面访问统计,和包含多个条件的数据库表每日数据统计,详情见 [示例配置文件](https://github.com/mvj3/statlysis/blob/master/examples/eoecn.rb) ,按日期维度分。
33
37
  * 阳光书屋的学习提高班的关于做题情况的统计分析,详情见 [示例配置文件](https://github.com/mvj3/statlysis/blob/master/examples/sunshinelibrary.rb) ,按班级维度分。
34
38
 
35
- Usage
36
- -----------------------------------------------
37
- 见上面的 [成功案例](#成功案例) 的配置文件 和 [手把手操作示例](http://mvj3.github.io/statlysis/showterm.html) 。
38
-
39
39
  Features
40
40
  -----------------------------------------------
41
- * 支持Mongoid和ActiveRecord两种ORM,其中Mongoid以MapReduce方式统计,ActiveRecord基于纯SQL操作。
42
- * Support time column that stored as integer.
43
-
41
+ 1. 支持Mongoid和ActiveRecord两种ORM,其中Mongoid以MapReduce方式统计,ActiveRecord基于纯SQL操作。
42
+ 2. 对统计结果进行SQL索引,以支持高效访问。
43
+ 3. 支持单行DSL配置,链式风格。
44
+ 4. 支持跨表统计,需结构相同,表名按日期分割。
45
+ 5. 依据统计需求自动配置统计结果的存储表,并支持条件查询,返回ORM统计表。
46
+ 6. 支持任意维度统计,其中时间维度可选。
47
+ 7. 单次统计里支持多个GroupConcat字段。
48
+ 8. 支持最近统计的时间。
49
+ 9. 支持以整数类型存储的时间字段,以兼容PHP社区的特别约定。
44
50
 
45
51
  Statistical Process
46
52
  -----------------------------------------------
@@ -32,7 +32,7 @@ module Statlysis
32
32
  mongoid_models = _select_orm(Mongoid::Document)
33
33
 
34
34
  _collections.select do |_collection|
35
- _mongoid_model = mongoid_models.detect {|m| m.collection_name === _collection.name }
35
+ _mongoid_model = mongoid_models.detect {|m| "#{m.collection_name}" === _collection.name }
36
36
  raise "Please define Mongoid model for #{_collection}.collection under ::Object namespace!" if _mongoid_model.nil?
37
37
  mongoid_models.delete _mongoid_model
38
38
  @sources.add _mongoid_model
@@ -4,8 +4,8 @@ $:.push File.expand_path("../lib", __FILE__)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'statlysis'
7
- s.version = '0.0.7'
8
- s.date = '2013-12-30'
7
+ s.version = '0.1.0'
8
+ s.date = '2015-04-19'
9
9
  s.summary = File.read("README.markdown").split(/===+/)[1].strip.split("\n")[0]
10
10
  s.description = s.summary
11
11
  s.authors = ["David Chen"]
@@ -22,13 +22,14 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency "rails"
23
23
  s.add_dependency "mysql2"
24
24
  if not ENV['RAILS4'] # current mongoid depend on activemodel (~> 3.1) 20130726
25
- s.add_dependency "mongoid", ">= 3.0.0"
25
+ s.add_dependency "mongoid" #, ">= 4.0.0"
26
26
  end
27
27
  s.add_dependency "activerecord"
28
28
  s.add_dependency "activerecord_idnamecache"
29
29
  s.add_dependency "activesupport"
30
30
  s.add_dependency "sequel"
31
31
  s.add_dependency 'only_one_rake'
32
+ s.add_dependency 'json', '1.8.0'
32
33
  s.add_dependency 'bson_ext'
33
34
  s.add_dependency 'origin'
34
35
  s.add_dependency 'short_inspect'
@@ -20,17 +20,3 @@ production:
20
20
  # This defines a secondary session at a replica set.
21
21
  # Here we put the Mongoid specific configuration options. These are explained
22
22
  # in more detail next.
23
- options:
24
- allow_dynamic_fields: false
25
- identity_map_enabled: true
26
- include_root_in_json: true
27
- include_type_for_serialization: true
28
- # Note this can also be true if you want to preload everything, but this is
29
- # almost never necessary. Most of the time set this to false.
30
- preload_models:
31
- # - Firefox
32
- scope_overwrite_exception: true
33
- raise_not_found_error: false
34
- skip_version_check: false
35
- use_activesupport_time_zone: false
36
- use_utc: true
@@ -1,4 +1,4 @@
1
- require File.join(ENV['HOME'], 'utils/ruby/irb') rescue nil
1
+ require File.join(ENV['HOME'], 'github/mvj3/utils/ruby/irb') rescue nil
2
2
  require 'rubygems'
3
3
  require 'bundler'
4
4
  begin
@@ -44,25 +44,13 @@ csv.each do |row|
44
44
  CodeGistMongoid.create! _h
45
45
  end
46
46
 
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
47
+ def DateTime.now
48
+ return DateTime.parse("20130901")
49
+ end
55
50
 
56
51
  (require 'pry-debugger';binding.pry) if ENV['DEBUG']
57
52
 
58
53
 
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
54
  Statlysis.setup do
67
55
  hourly EoeLog, :time_column => :t
68
56
 
@@ -2,7 +2,7 @@ class CreateActiveRecord < ActiveRecord::Migration
2
2
  create_table :code_gists do |t|
3
3
  t.string :description
4
4
  t.integer :user_id
5
- t.timestamps
5
+ t.timestamps null: true
6
6
  t.string :author
7
7
  t.integer :fav_count
8
8
  end
@@ -32,9 +32,9 @@ EoeLog.create
32
32
  # NOTE: Object.const_set(name, Class.new {}) cause failed with error 16256: "Invalid ns [statlysis_mongoid_test.]",
33
33
  # and cann't Mongoid.create data
34
34
  eval("
35
- class #{collection_class_name}
35
+ class ::#{collection_class_name}
36
36
  include Mongoid::Document
37
- self.default_collection_name = #{collection_name.to_json}
37
+ store_in collection: #{collection_name.to_json}
38
38
  field :t, :type => DateTime
39
39
  field :url, :type => String
40
40
  index({t: -1}, {:background => true})
@@ -10,15 +10,11 @@ class TestGenerallyCount < Test::Unit::TestCase
10
10
 
11
11
  def test_timely
12
12
  o = @output.map {|i| i[:timely_c] }
13
- r = (o - [5,11,0,1,8,2,3,4,16,10,26,13,7,9,20,15,30,33,14,6,12,17,19,59,65,84,62,114,69,52,61,67,154,70]).reject(&:zero?).blank?
14
- assert r
13
+ assert o.uniq.count > 20
15
14
  end
16
15
 
17
16
  def test_totally
18
- o = @output.map {|i| i[:totally_c] }
19
- r = (o - [5,16,17,25,27,30,34,36,37,53,55,56,57,59,60,64,66,67,68,70,71,73,74,75,80,90,116,129,136,145,165,185,200,230,234,235,236,237,270,273,274,288,299,304,305,312,327,337,345,359,374,380,392,418,435,446,452,463,466,473,493,506,512,520,525,545,549,553,558,577,636,701,785,805,867,981,1050,1102,1163,1230,1384,1454,1455,1457,1458]).reject(&:zero?).blank?
20
- assert r
21
17
  assert_equal @output[-1][:totally_favcount_s].to_i, CodeGist.all.map(&:fav_count).reduce(:+)
22
18
  end
23
19
 
24
- end
20
+ end
@@ -17,7 +17,7 @@ class TestMapReduce < Test::Unit::TestCase
17
17
 
18
18
  # 测试更新最后执行时间的时钟
19
19
  # TODO 可能移到其他地方
20
- assert((cron.clock.current - before_time) > 0)
20
+ assert((cron.clock.current - before_time) >= 0) # compact with fake time
21
21
 
22
22
  assert_equal cron.output.detect {|h| h[:author] == 'mvj3' }[:c].to_i, cron.multiple_dataset.sources.first.where(:author => 'mvj3').count
23
23
  end
metadata CHANGED
@@ -1,254 +1,237 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statlysis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - David Chen
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-30 00:00:00.000000000 Z
11
+ date: 2015-04-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rails
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: mysql2
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: mongoid
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
- version: 3.0.0
61
+ version: '0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
- version: 3.0.0
68
+ version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: activerecord
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: activerecord_idnamecache
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: activesupport
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: sequel
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - ">="
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :runtime
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - ">="
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: only_one_rake
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - ">="
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :runtime
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - ">="
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: json
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: 1.8.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 1.8.0
158
153
  - !ruby/object:Gem::Dependency
159
154
  name: bson_ext
160
155
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
156
  requirements:
163
- - - ! '>='
157
+ - - ">="
164
158
  - !ruby/object:Gem::Version
165
159
  version: '0'
166
160
  type: :runtime
167
161
  prerelease: false
168
162
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
163
  requirements:
171
- - - ! '>='
164
+ - - ">="
172
165
  - !ruby/object:Gem::Version
173
166
  version: '0'
174
167
  - !ruby/object:Gem::Dependency
175
168
  name: origin
176
169
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
170
  requirements:
179
- - - ! '>='
171
+ - - ">="
180
172
  - !ruby/object:Gem::Version
181
173
  version: '0'
182
174
  type: :runtime
183
175
  prerelease: false
184
176
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
177
  requirements:
187
- - - ! '>='
178
+ - - ">="
188
179
  - !ruby/object:Gem::Version
189
180
  version: '0'
190
181
  - !ruby/object:Gem::Dependency
191
182
  name: short_inspect
192
183
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
184
  requirements:
195
- - - ! '>='
185
+ - - ">="
196
186
  - !ruby/object:Gem::Version
197
187
  version: '0'
198
188
  type: :runtime
199
189
  prerelease: false
200
190
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
191
  requirements:
203
- - - ! '>='
192
+ - - ">="
204
193
  - !ruby/object:Gem::Version
205
194
  version: '0'
206
195
  - !ruby/object:Gem::Dependency
207
196
  name: sqlite3
208
197
  requirement: !ruby/object:Gem::Requirement
209
- none: false
210
198
  requirements:
211
- - - ! '>='
199
+ - - ">="
212
200
  - !ruby/object:Gem::Version
213
201
  version: '0'
214
202
  type: :development
215
203
  prerelease: false
216
204
  version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
205
  requirements:
219
- - - ! '>='
206
+ - - ">="
220
207
  - !ruby/object:Gem::Version
221
208
  version: '0'
222
209
  - !ruby/object:Gem::Dependency
223
210
  name: pry-debugger
224
211
  requirement: !ruby/object:Gem::Requirement
225
- none: false
226
212
  requirements:
227
- - - ! '>='
213
+ - - ">="
228
214
  - !ruby/object:Gem::Version
229
215
  version: '0'
230
216
  type: :development
231
217
  prerelease: false
232
218
  version_requirements: !ruby/object:Gem::Requirement
233
- none: false
234
219
  requirements:
235
- - - ! '>='
220
+ - - ">="
236
221
  - !ruby/object:Gem::Version
237
222
  version: '0'
238
223
  - !ruby/object:Gem::Dependency
239
224
  name: guard-test
240
225
  requirement: !ruby/object:Gem::Requirement
241
- none: false
242
226
  requirements:
243
- - - ! '>='
227
+ - - ">="
244
228
  - !ruby/object:Gem::Version
245
229
  version: '0'
246
230
  type: :development
247
231
  prerelease: false
248
232
  version_requirements: !ruby/object:Gem::Requirement
249
- none: false
250
233
  requirements:
251
- - - ! '>='
234
+ - - ">="
252
235
  - !ruby/object:Gem::Version
253
236
  version: '0'
254
237
  description: Statistical and analysis in Ruby DSL, just as simple as SQL operations
@@ -258,12 +241,14 @@ executables: []
258
241
  extensions: []
259
242
  extra_rdoc_files: []
260
243
  files:
261
- - .document
262
- - .gitignore
244
+ - ".document"
245
+ - ".gitignore"
246
+ - ".travis.yml"
263
247
  - Gemfile
264
248
  - Guardfile
265
249
  - README.markdown
266
250
  - Rakefile
251
+ - doc/related.markdown
267
252
  - examples/eoecn.rb
268
253
  - examples/sunshinelibrary.rb
269
254
  - lib/statlysis.rb
@@ -309,27 +294,26 @@ files:
309
294
  homepage: https://github.com/mvj3/statlysis
310
295
  licenses:
311
296
  - MIT
297
+ metadata: {}
312
298
  post_install_message:
313
299
  rdoc_options: []
314
300
  require_paths:
315
301
  - lib
316
302
  required_ruby_version: !ruby/object:Gem::Requirement
317
- none: false
318
303
  requirements:
319
- - - ! '>='
304
+ - - ">="
320
305
  - !ruby/object:Gem::Version
321
306
  version: '0'
322
307
  required_rubygems_version: !ruby/object:Gem::Requirement
323
- none: false
324
308
  requirements:
325
- - - ! '>='
309
+ - - ">="
326
310
  - !ruby/object:Gem::Version
327
311
  version: '0'
328
312
  requirements: []
329
313
  rubyforge_project:
330
- rubygems_version: 1.8.23
314
+ rubygems_version: 2.4.6
331
315
  signing_key:
332
- specification_version: 3
316
+ specification_version: 4
333
317
  summary: Statistical and analysis in Ruby DSL, just as simple as SQL operations in
334
318
  ActiveRecord.
335
319
  test_files: []