From cdb8446c8619a58cacf4002c22c3a218819d327f Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Wed, 23 Aug 2017 13:23:12 -0700 Subject: [PATCH] Make Articles table own the various related and lookup tables. --- Frameworks/Database/ArticlesTable.swift | 46 +++++++++++++++- Frameworks/Database/Database.swift | 55 ++++++------------- .../Database.xcodeproj/project.pbxproj | 2 +- 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/Frameworks/Database/ArticlesTable.swift b/Frameworks/Database/ArticlesTable.swift index 86b3f0f6b..00ea7ab42 100644 --- a/Frameworks/Database/ArticlesTable.swift +++ b/Frameworks/Database/ArticlesTable.swift @@ -7,18 +7,35 @@ // import Foundation +import RSCore import RSDatabase +import RSParser import Data final class ArticlesTable: DatabaseTable { let name: String let databaseIDKey = DatabaseKey.articleID + private let statusesTable: StatusesTable + private let authorsLookupTable: DatabaseLookupTable + private let attachmentsLookupTable: DatabaseLookupTable + private let tagsLookupTable: DatabaseLookupTable + // private let cachedArticles: NSMapTable = NSMapTable.weakToWeakObjects() init(name: String) { self.name = name + + self.statusesTable = StatusesTable(name: DatabaseTableName.statuses) + let authorsTable = AuthorsTable(name: DatabaseTableName.authors) + self.authorsLookupTable = DatabaseLookupTable(name: DatabaseTableName.authorsLookup, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.authorID, relatedTable: authorsTable, relationshipName: RelationshipName.authors) + + let tagsTable = TagsTable(name: DatabaseTableName.tags) + self.tagsLookupTable = DatabaseLookupTable(name: DatabaseTableName.tags, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.tagName, relatedTable: tagsTable, relationshipName: RelationshipName.tags) + + let attachmentsTable = AttachmentsTable(name: DatabaseTableName.attachments) + self.attachmentsLookupTable = DatabaseLookupTable(name: DatabaseTableName.attachmentsLookup, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.attachmentID, relatedTable: attachmentsTable, relationshipName: RelationshipName.attachments) } // MARK: DatabaseTable Methods @@ -32,26 +49,49 @@ final class ArticlesTable: DatabaseTable { } func save(_ objects: [DatabaseObject], in database: FMDatabase) { + // TODO } // MARK: Fetching - func fetchArticlesForFeed(_ feed: Feed) -> Set
{ + func fetchArticles(_ feed: Feed) -> Set
{ return Set
() // TODO } - func fetchArticlesForFeedAsync(_ feed: Feed, _ resultBlock: @escaping ArticleResultBlock) { + func fetchArticlesAsync(_ feed: Feed, _ resultBlock: @escaping ArticleResultBlock) { // TODO } - func fetchUnreadArticlesForFeeds(_ feeds: Set) -> Set
{ + func fetchUnreadArticles(_ feeds: Set) -> Set
{ return Set
() // TODO } + // MARK: Updating + + func update(_ feed: Feed, _ parsedFeed: ParsedFeed, _ completion: @escaping RSVoidCompletionBlock) { + + // TODO + } + + // MARK: Unread Counts + + func fetchUnreadCounts(_ feeds: Set, _ completion: @escaping UnreadCountCompletionBlock) { + + // TODO + } + + // MARK: Status + + func mark(_ articles: Set
, _ statusKey: String, _ flag: Bool) { + + // TODO + } + + // func uniquedArticles(_ fetchedArticles: Set
, statusesTable: StatusesTable) -> Set
{ // // var articles = Set
() diff --git a/Frameworks/Database/Database.swift b/Frameworks/Database/Database.swift index 8c1b1da8b..d61a8ba9c 100644 --- a/Frameworks/Database/Database.swift +++ b/Frameworks/Database/Database.swift @@ -12,47 +12,27 @@ import RSDatabase import RSParser import Data -private let sqlLogging = false +public typealias ArticleResultBlock = (Set
) -> Void +public typealias UnreadCountTable = [String: Int] // feedID: unreadCount +public typealias UnreadCountCompletionBlock = (UnreadCountTable) -> Void //feedID: unreadCount -private func logSQL(_ sql: String) { - if sqlLogging { - print("SQL: \(sql)") - } -} - -typealias ArticleResultBlock = (Set
) -> Void - -final class Database { +public final class Database { private let queue: RSDatabaseQueue private let databaseFile: String private let articlesTable: ArticlesTable - private let statusesTable: StatusesTable - private let authorsLookupTable: DatabaseLookupTable - private let attachmentsLookupTable: DatabaseLookupTable - private let tagsLookupTable: DatabaseLookupTable private var articleArrivalCutoffDate = NSDate.rs_dateWithNumberOfDays(inThePast: 3 * 31)! private let minimumNumberOfArticles = 10 private weak var delegate: AccountDelegate? - init(databaseFile: String, delegate: AccountDelegate) { + public init(databaseFile: String, delegate: AccountDelegate) { self.delegate = delegate self.databaseFile = databaseFile self.queue = RSDatabaseQueue(filepath: databaseFile, excludeFromBackup: false) self.articlesTable = ArticlesTable(name: DatabaseTableName.articles) - self.statusesTable = StatusesTable(name: DatabaseTableName.statuses) - let authorsTable = AuthorsTable(name: DatabaseTableName.authors) - self.authorsLookupTable = DatabaseLookupTable(name: DatabaseTableName.authorsLookup, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.authorID, relatedTable: authorsTable, relationshipName: RelationshipName.authors) - - let tagsTable = TagsTable(name: DatabaseTableName.tags) - self.tagsLookupTable = DatabaseLookupTable(name: DatabaseTableName.tags, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.tagName, relatedTable: tagsTable, relationshipName: RelationshipName.tags) - - let attachmentsTable = AttachmentsTable(name: DatabaseTableName.attachments) - self.attachmentsLookupTable = DatabaseLookupTable(name: DatabaseTableName.attachmentsLookup, objectIDKey: DatabaseKey.articleID, relatedObjectIDKey: DatabaseKey.attachmentID, relatedTable: attachmentsTable, relationshipName: RelationshipName.attachments) - let createStatementsPath = Bundle(for: type(of: self)).path(forResource: "CreateStatements", ofType: "sql")! let createStatements = try! NSString(contentsOfFile: createStatementsPath, encoding: String.Encoding.utf8.rawValue) queue.createTables(usingStatements: createStatements as String) @@ -61,9 +41,9 @@ final class Database { // MARK: - Fetching Articles - func fetchArticlesForFeed(_ feed: Feed) -> Set
{ + public func fetchArticles(for feed: Feed) -> Set
{ - return articlesTable.fetchArticlesForFeed(feed) + return articlesTable.fetchArticles(feed) // return Set
() // TODO // var fetchedArticles = Set
() @@ -78,9 +58,9 @@ final class Database { // return filteredArticles(articles, feedCounts: [feed.feedID: fetchedArticles.count]) } - func fetchArticlesForFeedAsync(_ feed: Feed, _ resultBlock: @escaping ArticleResultBlock) { + public func fetchArticlesAsync(for feed: Feed, _ resultBlock: @escaping ArticleResultBlock) { - articlesTable.fetchArticlesForFeedAsync(feed, resultBlock) + articlesTable.fetchArticlesAsync(feed, resultBlock) // let feedID = feed.feedID // @@ -97,19 +77,17 @@ final class Database { // } } - func fetchUnreadArticlesForFolder(_ folder: Folder) -> Set
{ + public func fetchUnreadArticles(for folder: Folder) -> Set
{ - return articlesTable.fetchUnreadArticlesForFeeds(folder.flattenedFeeds()) -// return fetchUnreadArticlesForFeedIDs(folder.flattenedFeedIDs()) + return articlesTable.fetchUnreadArticles(folder.flattenedFeeds()) } // MARK: - Unread Counts - typealias UnreadCountTable = [String: Int] // feedID: unreadCount - typealias UnreadCountCompletionBlock = (UnreadCountTable) -> Void //feedID: unreadCount - func fetchUnreadCounts(for feeds: Set, completion: @escaping UnreadCountCompletionBlock) { + public func fetchUnreadCounts(for feeds: Set, completion: @escaping UnreadCountCompletionBlock) { + return articlesTable.fetchUnreadCounts(feeds, completion) // let feedIDs = feeds.feedIDs() // // queue.fetch { (database: FMDatabase!) -> Void in @@ -127,8 +105,10 @@ final class Database { // MARK: - Updating Articles - func updateFeedWithParsedFeed(_ feed: Feed, parsedFeed: ParsedFeed, completionHandler: @escaping RSVoidCompletionBlock) { + public func update(feed: Feed, parsedFeed: ParsedFeed, completion: @escaping RSVoidCompletionBlock) { + return articlesTable.update(feed, parsedFeed, completion) + // if parsedFeed.items.isEmpty { // completionHandler() // return @@ -145,8 +125,9 @@ final class Database { // MARK: - Status - func markArticles(_ articles: Set
, statusKey: ArticleStatusKey, flag: Bool) { + public func mark(_ articles: Set
, statusKey: String, flag: Bool) { + articlesTable.mark(articles, statusKey, flag) // statusesTable.markArticles(articles, statusKey: statusKey, flag: flag) } } diff --git a/Frameworks/Database/Database.xcodeproj/project.pbxproj b/Frameworks/Database/Database.xcodeproj/project.pbxproj index 01535452e..198ced1cd 100644 --- a/Frameworks/Database/Database.xcodeproj/project.pbxproj +++ b/Frameworks/Database/Database.xcodeproj/project.pbxproj @@ -246,9 +246,9 @@ isa = PBXGroup; children = ( 84E156F11F0AB83600F8CC05 /* Data.xcodeproj */, + 84E157001F0AB89B00F8CC05 /* RSDatabase.xcodeproj */, 84BB4B8F1F119C4900858766 /* RSCore.xcodeproj */, 8461461E1F0ABC7300870CB3 /* RSParser.xcodeproj */, - 84E157001F0AB89B00F8CC05 /* RSDatabase.xcodeproj */, ); name = Frameworks; sourceTree = "";