comparison Lists.lua @ 105:c6c748a5823b tip

Collaborative list trimming 80% functional Updates for the zone-in problem
author John@Yosemite-PC
date Sun, 06 May 2012 08:33:34 -0400
parents 25c127c4c1e8
children
comparison
equal deleted inserted replaced
104:9aa2dcbbdc87 105:c6c748a5823b
6 -- 6 --
7 -- A separate user list is held - lists index into this 7 -- A separate user list is held - lists index into this
8 8
9 9
10 -- TODO: switch all action functions to use identifiers rather than names 10 -- TODO: switch all action functions to use identifiers rather than names
11 -- TODO: collaborative list trimming
12 -- TODO: collapse slists into delimited strings for space (premature optimization?) 11 -- TODO: collapse slists into delimited strings for space (premature optimization?)
13 -- TODO: organize working state data a little more carefully - hard to keep 12 -- TODO: organize working state data a little more carefully - hard to keep
14 -- track of all the arrays that are floating out there 13 -- track of all the arrays that are floating out there
15 14
16 -- holy crap long notes {{{ 15 -- holy crap long notes {{{
848 else 847 else
849 break 848 break
850 end 849 end
851 end 850 end
852 851
853 -- apply first half 852 print("before -",#before)
853 --return
854
855 --apply first half
854 CreateWorkingStateFromChanges(before) 856 CreateWorkingStateFromChanges(before)
855 857
856 -- save this state permanently; trim the changes permanently 858 -- save this state permanently; trim the changes permanently
857 LootLists:SaveToDB(db) 859 LootLists:SaveToDB(db)
858 PersonList:SaveToDB(db) 860 PersonList:SaveToDB(db)
859 while db.profile.changes ~= nil and db.profile.changes[1] ~= nil and db.profile.changes[1].time <= time do 861 while db.profile.changes ~= nil and db.profile.changes[1] ~= nil and db.profile.changes[1].time <= time do
860 table.remove(db.profile.changes,1) 862 table.remove(db.profile.changes,1)
861 end 863 end
864 print("reapplying ",_G.getn(db.profile.changes))
862 db.profile.time = lastTime 865 db.profile.time = lastTime
863 866
864 -- using the trimmed list and the new bases, recreate the working state 867 -- using the trimmed list and the new bases, recreate the working state
865 CreateWorkingStateFromChanges(db.profile.changes) 868 --CreateWorkingStateFromChanges(db.profile.changes)
869
870 for i,v in ipairs(db.profile.changes) do
871 ProcessChange(v)
872 end
873
874 if changelistener then
875 changelistener:dataevent()
876 end
866 end 877 end
867 878
868 879
869 function PopulateListRandom(listIndex) 880 function PopulateListRandom(listIndex)
870 -- difference (raid+reserve)-list, then random shuffle that, then add 881 -- difference (raid+reserve)-list, then random shuffle that, then add
941 else 952 else
942 return false, {} 953 return false, {}
943 end 954 end
944 end 955 end
945 956
946 function IntegrateChangeDiff(remoteChanges) -- todo: check against remoteBase before committing to insanity 957 function IntegrateChangeDiff(remoteBase,remoteChanges)
947 local c = remoteChanges 958 local c = remoteChanges
948 local old = db.profile.changes 959 local old = db.profile.changes
949 960
950 local new = {} 961 local new = {}
951 962
952 local op = 1 963 local op = 1
953 local cp = 1 964 local cp = 1
954 965
955 local no = getn(old) 966 local no = getn(old)
967
968 local worthRefresh = false -- only worth refreshing if we take changes from c
969
970 -- if remotebase is older, don't integrate anything prior to db.profile.time. if they're newer, it's ok to merge in their changes
971 if remoteBase < db.profile.time then
972 while c[1] and c[1].time < db.profile.time do
973 table.remove(c,1)
974 end
975 end
976
956 local nc = getn(c) 977 local nc = getn(c)
957 978
958 if no == 0 then 979 if no == 0 and nc > 0 then
980 worthRefresh = true
959 db.profile.changes = c 981 db.profile.changes = c
960 else 982 else
961 while op <= no or cp <= nc do -- lists are pre-sorted. insertion merge them 983 while op <= no or cp <= nc do -- lists are pre-sorted. insertion merge them
962 if cp > nc then -- inelegant - edge cases first, then the normal logic 984 if cp > nc then -- inelegant - edge cases first, then the normal logic
963 table.insert(new,old[op]) 985 table.insert(new,old[op])
964 op = op + 1 986 op = op + 1
965 elseif op > no then 987 elseif op > no then
988 worthRefresh=true
966 table.insert(new,c[cp]) 989 table.insert(new,c[cp])
967 cp = cp + 1 990 cp = cp + 1
991 elseif c[cp].time == old[op].time then
992 -- todo: even though they're the same timestamp, still compare
993 -- contents for sanity
994 table.insert(new,old[cp])
995 cp = cp + 1
996 op = op + 1
968 elseif c[cp].time < old[op].time then 997 elseif c[cp].time < old[op].time then
998 worthRefresh=true
969 table.insert(new,c[cp]) 999 table.insert(new,c[cp])
970 cp = cp + 1 1000 cp = cp + 1
971 elseif c[cp].time > old[op].time then 1001 elseif c[cp].time > old[op].time then
972 table.insert(new,old[op]) 1002 table.insert(new,old[op])
973 op = op + 1 1003 op = op + 1
977 end 1007 end
978 print("Updating changes - ",getn(new), "entries") 1008 print("Updating changes - ",getn(new), "entries")
979 db.profile.changes = new 1009 db.profile.changes = new
980 end 1010 end
981 1011
982 CreateWorkingStateFromChanges(db.profile.changes) 1012 if worthRefresh then
983 if changeListener then 1013 CreateWorkingStateFromChanges(db.profile.changes)
984 changeListener:DataEvent() 1014 if changelistener then
985 end 1015 changelistener:dataevent()
986 end 1016 end
1017 end
1018 end