geoptima 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/bin/show_geoptima CHANGED
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version(">=0.1.6")
11
+ Geoptima::assert_version(">=0.1.9")
12
12
 
13
13
  $debug=false
14
14
 
@@ -297,6 +297,7 @@ $datasets.keys.sort.each do |imei|
297
297
  if $verbose
298
298
  puts "\tFirst Event: #{dataset.first}"
299
299
  puts "\tLast Event: #{dataset.last}"
300
+ dataset.report_errors "\t"
300
301
  end
301
302
  if events && ($print || $export)
302
303
  names = $event_names
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version(">=0.1.6")
11
+ Geoptima::assert_version(">=0.1.9")
12
12
 
13
13
  $debug=false
14
14
 
@@ -297,6 +297,7 @@ $datasets.keys.sort.each do |imei|
297
297
  if $verbose
298
298
  puts "\tFirst Event: #{dataset.first}"
299
299
  puts "\tLast Event: #{dataset.last}"
300
+ dataset.report_errors "\t"
300
301
  end
301
302
  if events && ($print || $export)
302
303
  names = $event_names
data/lib/geoptima/data.rb CHANGED
@@ -33,9 +33,34 @@ module Geoptima
33
33
  end
34
34
  end
35
35
 
36
+ module ErrorCounter
37
+ attr_reader :errors
38
+ def errors
39
+ @errors ||= {}
40
+ end
41
+ def incr_error(name)
42
+ errors[name] ||= 0
43
+ errors[name] += 1
44
+ end
45
+ def combine_errors(other)
46
+ puts "Combining errors(#{other.class}:#{other.errors.inspect}) into self(#{self.class}:#{errors.inspect})" if($debug)
47
+ other.errors.keys.each do |name|
48
+ errors[name] = errors[name].to_i + other.errors[name].to_i
49
+ end
50
+ end
51
+ def report_errors(prefix=nil)
52
+ if errors && errors.keys.length > 0
53
+ puts "#{prefix}Have #{errors.keys.length} known errors in #{self}:"
54
+ errors.keys.sort.each do |name|
55
+ puts "#{prefix}\t#{name}:\t#{errors[name]}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
36
61
  # The Geoptima::Event class represents and individual record or event
37
62
  class Event
38
- KNOWN_HEADERS={
63
+ KNOWN_HEADERS = {
39
64
  "gps" => ["timeoffset","latitude","longitude","altitude","accuracy","direction","speed"],
40
65
  "service" => ["timeoffset","plmn","cell_id","lac","mnc","mcc"],
41
66
  "call" => ["timeoffset","status","number"],
@@ -48,8 +73,27 @@ module Geoptima
48
73
  "httpRequest" => ["timeoffset","interface","address","delay","speed"],
49
74
  "dnsLookup" => ["timeoffset","interface","address","lookupTime","ip"],
50
75
  "ftpSpeed" => ["timeoffset","interface","direction","delay","peak","speed"],
51
- "browserDedicatedTest" => ["timeoffset","url","pageRenders","pageRendered","pageSize","success"]
76
+ "browserDedicatedTest" => ["timeoffset","url","pageRenders","pageRendered","pageSize","success"],
77
+ "pingTest" => ["timeoffset","interface","address","count","length","pingTime","packetLossPercent","jitter","error"]
52
78
  }
79
+ HEADER_BUGS = {
80
+ 'ftpSpeed' => '#4303',
81
+ 'pingTest' => '#4509'
82
+ }
83
+ ALT_HEADERS = {
84
+ "pingTest" => [
85
+ ["timeoffset","interface","address","count","length","pingTime","packetLossPercent","jitter","error"],
86
+ ["timeoffset","id","interface","address","count","length","pingTime","packetLossPercent","jitter","error"]
87
+ ],
88
+ "ftpSpeed" => [
89
+ ["timeoffset","interface","direction","delay","speed"],
90
+ ["timeoffset","interface","direction","delay","peak","speed"],
91
+ ["timeoffset","interface","direction","delay","peak","speed","error"],
92
+ ["timeoffset","interface","direction","delay","peak","speed","size","error"]
93
+ ]
94
+ }
95
+
96
+ include ErrorCounter
53
97
  attr_reader :file, :header, :name, :data, :fields, :time, :latitude, :longitude
54
98
  def initialize(file,start,name,header,data)
55
99
  @file = file
@@ -60,11 +104,17 @@ module Geoptima
60
104
  a[v] = check_field(@data[a.length])
61
105
  a
62
106
  end
63
- @time = start + (@fields['timeoffset'].to_f / MSPERDAY.to_f)
107
+ timeoffset = (@fields['timeoffset'].to_f / MSPERDAY.to_f)
108
+ if(timeoffset<-0.0000001)
109
+ puts "Have negative time offset: #{@fields['timeoffset']}" if($debug)
110
+ incr_error "#4506 negative offsets"
111
+ end
112
+ @time = start + timeoffset
64
113
  @fields.reject!{|k,v| k=~/timeoffset/}
65
114
  if @fields['cell_id'].to_i > SHORT
66
115
  @fields['cell_id'] = @fields['cell_id'].to_i % SHORT
67
116
  end
117
+ incr_error "Empty data" if(data.length == 0)
68
118
  puts "Created Event: #{self}" if($debug)
69
119
  end
70
120
  def check_field(field)
@@ -102,12 +152,14 @@ module Geoptima
102
152
 
103
153
  # The Geoptima::Data is an entire JSON file of events
104
154
  class Data
155
+ include ErrorCounter
105
156
  attr_reader :path, :json, :count
106
157
  def initialize(path)
107
158
  @path = path
108
159
  # @json = JSON.parse(File.read(path))
109
160
  @json = MultiJson.decode(File.read(path))
110
161
  @fields = {}
162
+ @errors = {}
111
163
  if $debug
112
164
  puts "Read Geoptima: #{geoptima.to_json}"
113
165
  puts "\tSubscriber: #{subscriber.to_json}"
@@ -118,6 +170,10 @@ module Geoptima
118
170
  puts "\tStart: #{start}"
119
171
  end
120
172
  end
173
+ def incr_error(name)
174
+ @errors[name] ||= 0
175
+ @errors[name] += 1
176
+ end
121
177
  def to_s
122
178
  json.to_json[0..100]
123
179
  end
@@ -193,6 +249,16 @@ module Geoptima
193
249
  if mismatch != 0
194
250
  puts "'#{event_type}' header length #{header.length} incompatible with data length #{events.length}"
195
251
  header = nil
252
+ incr_error "Metadata mismatch"
253
+ if Event::ALT_HEADERS.keys.grep(event_type).length>0
254
+ incr_error "#{Event::HEADER_BUGS[event_type]} #{event_type}"
255
+ [Event::KNOWN_HEADERS[event_type],*(Event::ALT_HEADERS[event_type])].each do |alt_header|
256
+ if alt_header && (events.length % alt_header.length) == 0
257
+ header = alt_header
258
+ puts "Found alternative header that matches #{event_type}: #{header.join(',')}"
259
+ end
260
+ end
261
+ end
196
262
  end
197
263
  else
198
264
  puts "No header found for event type: #{event_type}"
@@ -204,9 +270,12 @@ module Geoptima
204
270
  record = events[index...(index+header.length)]
205
271
  if record && record.length == header.length
206
272
  @count += 1
207
- a << Event.new(self,start,event_type,header,record)
273
+ event = Event.new(self,start,event_type,header,record)
274
+ combine_errors event
275
+ a << event
208
276
  else
209
277
  puts "Invalid '#{event_type}' data block #{block}: #{record.inspect}"
278
+ incr_error "Invalid data block"
210
279
  break a
211
280
  end
212
281
  end
@@ -226,7 +295,7 @@ module Geoptima
226
295
  @first = nil
227
296
  @last = nil
228
297
  events_data.each do |event_type,data|
229
- if data.length > 1
298
+ if data.length > 0
230
299
  @first ||= data[0]
231
300
  @last ||= data[-1]
232
301
  @first = data[0] if(@first && @first.time > data[0].time)
@@ -243,6 +312,7 @@ module Geoptima
243
312
 
244
313
  class Dataset
245
314
 
315
+ include ErrorCounter
246
316
  attr_reader :name, :options
247
317
 
248
318
  def initialize(name,options={})
@@ -409,6 +479,7 @@ module Geoptima
409
479
  event_hash[key] = event
410
480
  end
411
481
  end
482
+ combine_errors data
412
483
  end
413
484
  puts "After adding #{name} events, maps are #{event_hash.length} long" if($debug)
414
485
  end
@@ -1,6 +1,6 @@
1
1
  module Geoptima
2
2
 
3
- VERSION = "0.1.8"
3
+ VERSION = "0.1.9"
4
4
 
5
5
  class Version
6
6
  attr_reader :comparator, :version, :major, :minor, :patch
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoptima
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 8
10
- version: 0.1.8
9
+ - 9
10
+ version: 0.1.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Craig Taverner
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-18 00:00:00 Z
18
+ date: 2012-05-29 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: multi_json