Merge pull request #183 from amtep/master

[performance] preseed ANALYZE data in the db
[tests] Don't require GUI for the tests
[tests] benchmark for address lookups
remove unused functions from contactwriter
[performance] add index on OnlineAccounts.accountPath

SeasideCache looks up online accounts by a (path, uri) combination
and there wasn't an index on the path part. This led to a full
table scan of the OnlineAccounts table for every contactId.
Adding this index reduced the lookup time from 45ms to 1ms
for a 10k contacts database.

The values are looked up in separate subqueries so a combined
index is not useful.

The generated SQL:

SELECT Contacts.contactId
  FROM Contacts
 WHERE Contacts.contactId > 2
   AND Contacts.syncTarget = 'aggregate'
   AND Contacts.isDeactivated = 0
   AND Contacts.contactId IN (SELECT contactId FROM OnlineAccounts WHERE accountPath = ?)
   AND Contacts.contactId IN (SELECT contactId FROM OnlineAccounts WHERE lowerAccountUri = ?);

EXPLAIN QUERY PLAN before index:

0|0|0|SEARCH TABLE Contacts USING INTEGER PRIMARY KEY (rowid=?)
0|0|0|EXECUTE LIST SUBQUERY 1
1|0|0|SCAN TABLE OnlineAccounts
0|0|0|EXECUTE LIST SUBQUERY 2
2|0|0|SEARCH TABLE OnlineAccounts USING INDEX OnlineAccountsIndex (lowerAccountUri=?)

EXPLAIN QUERY PLAN after index:

0|0|0|SEARCH TABLE Contacts USING INTEGER PRIMARY KEY (rowid=?)
0|0|0|EXECUTE LIST SUBQUERY 1
1|0|0|SEARCH TABLE OnlineAccounts USING INDEX OnlineAccountsPathIndex (accountPath=?)
0|0|0|EXECUTE LIST SUBQUERY 2
2|0|0|SEARCH TABLE OnlineAccounts USING INDEX OnlineAccountsIndex (lowerAccountUri=?)