added notion of expiration to snapshot. Full scan to trim the snapshot is no longer needed
This commit is contained in:
+32
-17
@@ -1,7 +1,7 @@
|
||||
local private, public = {}, {}
|
||||
Aux.stat_histogram = public
|
||||
|
||||
private.NEW_RECORD = '0:0:0:0'
|
||||
private.NEW_RECORD = '0:0:0:0:'
|
||||
|
||||
function private.load_data()
|
||||
local dataset = Aux.persistence.load_dataset()
|
||||
@@ -19,11 +19,10 @@ function private.read_current_record(item_key)
|
||||
step = tonumber(record[3]),
|
||||
count = tonumber(record[4]),
|
||||
}
|
||||
local values = Aux.persistence.deserialize(record[5], ',')
|
||||
for i, value in ipairs(values) do
|
||||
values[i] = tonumber(value)
|
||||
private.current_record.values = {}
|
||||
for i=5, getn(record) do
|
||||
private.current_record.values[private.current_record.min - 5 + i] = tonumber(record[i])
|
||||
end
|
||||
private.current_record.values = values
|
||||
private.current_item_key = item_key
|
||||
end
|
||||
end
|
||||
@@ -31,21 +30,26 @@ end
|
||||
function private.write_current_record()
|
||||
local data = private.load_data()
|
||||
|
||||
local values = {}
|
||||
for i=private.current_record.min,private.current_record.max do
|
||||
tinsert(values, private.current_record.values[i])
|
||||
end
|
||||
|
||||
data.item_data[private.current_item_key] = Aux.persistence.serialize({
|
||||
private.current_record.min,
|
||||
private.current_record.max,
|
||||
private.current_record.step,
|
||||
private.current_record.count,
|
||||
Aux.persistence.serialize(private.current_record.values, ','),
|
||||
Aux.persistence.serialize(values, ':'),
|
||||
}, ':')
|
||||
end
|
||||
|
||||
function public.GetPriceData(item_key)
|
||||
function public.get_price_data(item_key)
|
||||
private.read_current_record(item_key)
|
||||
|
||||
local median = 0
|
||||
local Qone = 0
|
||||
local Qthree = 0
|
||||
local Q1 = 0
|
||||
local Q3 = 0
|
||||
local percent40 = 0
|
||||
local percent30 = 0
|
||||
local recount = 0
|
||||
@@ -55,9 +59,9 @@ function public.GetPriceData(item_key)
|
||||
else
|
||||
for i = private.current_record.min, private.current_record.max do
|
||||
recount = recount + private.current_record.values[i]
|
||||
if Qone == 0 and private.current_record.count > 4 then -- Q1 is meaningless with very little data
|
||||
if Q1 == 0 and private.current_record.count > 4 then -- Q1 is meaningless with very little data
|
||||
if recount >= private.current_record.count / 4 then
|
||||
Qone = i * private.current_record.step
|
||||
Q1 = i * private.current_record.step
|
||||
end
|
||||
end
|
||||
if percent30 == 0 then
|
||||
@@ -75,9 +79,9 @@ function public.GetPriceData(item_key)
|
||||
median = i * private.current_record.step
|
||||
end
|
||||
end
|
||||
if Qthree == 0 and private.current_record.count > 4 then -- Q3 is meaningless with very little data
|
||||
if Q3 == 0 and private.current_record.count > 4 then -- Q3 is meaningless with very little data
|
||||
if recount >= private.current_record.count * 3 / 4 then
|
||||
Qthree = i * private.current_record.step
|
||||
Q3 = i * private.current_record.step
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -95,7 +99,7 @@ function public.GetPriceData(item_key)
|
||||
end
|
||||
end
|
||||
|
||||
return median, Qone, Qthree, private.current_record.step, percent40, percent30, private.current_record.count
|
||||
return median, Q1, Q3, private.current_record.step, percent40, percent30, private.current_record.count
|
||||
end
|
||||
|
||||
function public.process_auction(auction_info)
|
||||
@@ -121,7 +125,7 @@ function public.process_auction(auction_info)
|
||||
index = 100
|
||||
end
|
||||
|
||||
if not private.current_record.min then
|
||||
if private.current_record.min == 0 then
|
||||
private.current_record.min = index
|
||||
private.current_record.max = index
|
||||
private.current_record.values[index] = 0
|
||||
@@ -130,12 +134,17 @@ function public.process_auction(auction_info)
|
||||
private.current_record.values[i] = 0
|
||||
end
|
||||
private.current_record.min = index
|
||||
elseif private.current_record.max < index then
|
||||
for i = private.current_record.max + 1, index do
|
||||
private.current_record.values[i] = 0
|
||||
end
|
||||
private.current_record.max = index
|
||||
end
|
||||
|
||||
private.current_record.values[index] = private.current_record.values[index] + 1
|
||||
private.current_record.count = private.current_record.count + 1
|
||||
|
||||
private.write_record()
|
||||
private.write_current_record()
|
||||
|
||||
elseif index <= 300 then
|
||||
|
||||
@@ -158,7 +167,7 @@ function public.process_auction(auction_info)
|
||||
private.current_record.values[index] = private.current_record.values[index] + 1
|
||||
private.current_record.count = private.current_record.count + 1
|
||||
|
||||
private.write_record()
|
||||
private.write_current_record()
|
||||
|
||||
end
|
||||
end
|
||||
@@ -166,6 +175,12 @@ end
|
||||
function private.refactor(pmax, precision)
|
||||
|
||||
local new_step = ceil(pmax / precision)
|
||||
|
||||
if getn(private.current_record.values) == 0 then
|
||||
private.current_record.step = new_step
|
||||
return
|
||||
end
|
||||
|
||||
local conversion = private.current_record.step / new_step
|
||||
local new_min = ceil(conversion * private.current_record.min)
|
||||
local new_max = ceil(conversion * private.current_record.max)
|
||||
|
||||
Reference in New Issue
Block a user