mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 04:25:31 +08:00
d3f62d4bb0
commit 7a67c1fd349c575a91b162024cc03050e86574c9 Author: Ben Gotow <bengotow@gmail.com> Date: Fri Jan 8 11:14:07 2016 -0800 WIP commit 891f23487827a447ec95406ef26f1473a0c07de6 Author: Ben Gotow <bengotow@gmail.com> Date: Wed Jan 6 15:25:09 2016 -0800 WIP commit 3c323cd4beb2df2fae2439a556d3129404d942cc Author: Ben Gotow <bengotow@gmail.com> Date: Mon Jan 4 17:46:11 2016 -0800 WIP commit ec7090ea9e1969fea2ea583f80a9a2ac41e6c8b0 Author: Ben Gotow <bengotow@gmail.com> Date: Mon Jan 4 17:22:07 2016 -0800 Remove unused LRUCache commit e10c3919559d3c364cb7bb94d19094a2444c10f3 Author: Ben Gotow <bengotow@gmail.com> Date: Mon Jan 4 16:21:37 2016 -0800 rm(database-view): Performance refactor of thread-list Summary: This diff removes the old DatabaseView class, which included lots of gross optimizations that have since been duplicated in QuerySubscription and makes the thread list use the QuerySubscription class. This diff also substantially replaces the QuerySubscription class. The new implementation actually makes more queries but is less gross and more straightforward. It leverages a couple findings from database profiling: - Because of the sqlite page cache, asking for ids you've previously asked for is very fast. + Don't bother sorting in memory to avoid a query, just ask for ids again and fill in any missing objects. - Loading and inflating models is 4x+ slower than just grabbing ids I've also added more convenience classes around database queries: - QueryRange: Represents {offset, limit}, and can do boolean intersections - QueryResultSet: Better than passing an array of 50 items when you really mean items 150-200. Also tries hard to be immutable. This diff doesn't fully remove the concept of a "ModelView" because it's used /everywhere/ in the multiselect list source. There's a small shim that we can remove when we refactor that code. Ideally, I think we should rename ModelView to "MultiselectListDataSource" to follow iOS conventions (eg UITableViewDataSource). RIP 80char lines? Test Plan: They've gone to hell. WIP. Reviewers: evan, juan Differential Revision: https://phab.nylas.com/D2408 commit 32607eee8aafb7fa98b866347bdd2c0b963a602c Author: Ben Gotow <bengotow@gmail.com> Date: Mon Jan 4 09:56:34 2016 -0800 WIP commit 5ab5fe74e94db6904bd77d224720ad9fc69fe6a7 Author: Ben Gotow <bengotow@gmail.com> Date: Wed Dec 30 22:56:46 2015 -0800 redo scrollbars to not require counts commit 361bb192d072dc8a69fd3ef143cad7bed214ebdc Author: Ben Gotow <bengotow@gmail.com> Date: Wed Dec 30 17:50:57 2015 -0800 wip commit 079394de1cc3344fb6568efe00a52d7fc97fbd27 Author: Ben Gotow <bengotow@gmail.com> Date: Wed Dec 30 13:49:11 2015 -0800 wip commit 65142be03c27c653fe1147fdde6c2f9b046ade22 Author: Ben Gotow <bengotow@gmail.com> Date: Wed Dec 30 01:23:20 2015 -0800 wip commit 5d412ec276be1104175ad0f43c9d54e1cea857bf Author: Ben Gotow <bengotow@gmail.com> Date: Tue Dec 29 22:49:58 2015 -0800 Refactor start commit d2b6eea884fcd2bd81ebe3985f2b2636a510c493 Author: Ben Gotow <bengotow@gmail.com> Date: Tue Dec 29 18:51:53 2015 -0800 RIP DatabaseView
50 lines
2.1 KiB
CoffeeScript
50 lines
2.1 KiB
CoffeeScript
QuerySubscriptionPool = require '../../src/flux/models/query-subscription-pool'
|
|
DatabaseStore = require '../../src/flux/stores/database-store'
|
|
Label = require '../../src/flux/models/label'
|
|
|
|
describe "QuerySubscriptionPool", ->
|
|
beforeEach ->
|
|
@query = DatabaseStore.findAll(Label)
|
|
@queryKey = @query.sql()
|
|
QuerySubscriptionPool._subscriptions = {}
|
|
|
|
describe "add", ->
|
|
it "should add a new subscription with the callback", ->
|
|
callback = jasmine.createSpy('callback')
|
|
QuerySubscriptionPool.add(@query, callback)
|
|
expect(QuerySubscriptionPool._subscriptions[@queryKey]).toBeDefined()
|
|
|
|
subscription = QuerySubscriptionPool._subscriptions[@queryKey]
|
|
expect(subscription.hasCallback(callback)).toBe(true)
|
|
|
|
it "should yield database changes to the subscription", ->
|
|
callback = jasmine.createSpy('callback')
|
|
QuerySubscriptionPool.add(@query, callback)
|
|
subscription = QuerySubscriptionPool._subscriptions[@queryKey]
|
|
spyOn(subscription, 'applyChangeRecord')
|
|
|
|
record = {objectType: 'whateves'}
|
|
QuerySubscriptionPool._onChange(record)
|
|
expect(subscription.applyChangeRecord).toHaveBeenCalledWith(record)
|
|
|
|
describe "unsubscribe", ->
|
|
it "should return an unsubscribe method", ->
|
|
expect(QuerySubscriptionPool.add(@query, -> ) instanceof Function).toBe(true)
|
|
|
|
it "should remove the callback from the subscription", ->
|
|
cb = ->
|
|
|
|
unsub = QuerySubscriptionPool.add(@query, cb)
|
|
subscription = QuerySubscriptionPool._subscriptions[@queryKey]
|
|
|
|
expect(subscription.hasCallback(cb)).toBe(true)
|
|
unsub()
|
|
expect(subscription.hasCallback(cb)).toBe(false)
|
|
|
|
it "should wait before removing th subscription to make sure it's not reused", ->
|
|
unsub = QuerySubscriptionPool.add(@query, -> )
|
|
expect(QuerySubscriptionPool._subscriptions[@queryKey]).toBeDefined()
|
|
unsub()
|
|
expect(QuerySubscriptionPool._subscriptions[@queryKey]).toBeDefined()
|
|
advanceClock()
|
|
expect(QuerySubscriptionPool._subscriptions[@queryKey]).toBeUndefined()
|