Remove SearchHistory from Core Data (IOS-196)

This commit is contained in:
Nathan Mattes 2023-11-23 14:50:49 +01:00
parent 9c662f4d78
commit 1e780481d1
7 changed files with 1 additions and 354 deletions

View File

@ -15,7 +15,7 @@ extension FileManager {
do {
let searchItems = try jsonDecoder.decode([Persistence.SearchHistory.Item].self, from: data)
.filter { $0.userID == userID }
.sorted { $0.updatedAt < $1.updatedAt }
.sorted { $0.updatedAt > $1.updatedAt }
return searchItems
} catch {

View File

@ -125,7 +125,6 @@
<relationship name="privateNotes" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="PrivateNote" inverseName="to" inverseEntity="PrivateNote"/>
<relationship name="privateNotesTo" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="PrivateNote" inverseName="from" inverseEntity="PrivateNote"/>
<relationship name="reblogged" toMany="YES" deletionRule="Nullify" destinationEntity="Status" inverseName="rebloggedBy" inverseEntity="Status"/>
<relationship name="searchHistories" toMany="YES" deletionRule="Nullify" destinationEntity="SearchHistory" inverseName="account" inverseEntity="SearchHistory"/>
<relationship name="showingReblogs" toMany="YES" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="showingReblogsBy" inverseEntity="MastodonUser"/>
<relationship name="showingReblogsBy" toMany="YES" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="showingReblogs" inverseEntity="MastodonUser"/>
<relationship name="statuses" toMany="YES" deletionRule="Nullify" destinationEntity="Status" inverseName="author" inverseEntity="Status"/>
@ -176,16 +175,6 @@
<relationship name="from" maxCount="1" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="privateNotesTo" inverseEntity="MastodonUser"/>
<relationship name="to" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="privateNotes" inverseEntity="MastodonUser"/>
</entity>
<entity name="SearchHistory" representedClassName="CoreDataStack.SearchHistory" syncable="YES">
<attribute name="createAt" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="domain" attributeType="String" defaultValueString=""/>
<attribute name="identifier" attributeType="UUID" usesScalarValueType="NO"/>
<attribute name="updatedAt" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="userID" attributeType="String" defaultValueString=""/>
<relationship name="account" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="searchHistories" inverseEntity="MastodonUser"/>
<relationship name="hashtag" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Tag" inverseName="searchHistories" inverseEntity="Tag"/>
<relationship name="status" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Status" inverseName="searchHistories" inverseEntity="Status"/>
</entity>
<entity name="Setting" representedClassName="CoreDataStack.Setting" syncable="YES">
<attribute name="createdAt" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="domain" attributeType="String"/>
@ -236,7 +225,6 @@
<relationship name="rebloggedBy" toMany="YES" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="reblogged" inverseEntity="MastodonUser"/>
<relationship name="replyFrom" toMany="YES" deletionRule="Nullify" destinationEntity="Status" inverseName="replyTo" inverseEntity="Status"/>
<relationship name="replyTo" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Status" inverseName="replyFrom" inverseEntity="Status"/>
<relationship name="searchHistories" toMany="YES" deletionRule="Cascade" destinationEntity="SearchHistory" inverseName="status" inverseEntity="SearchHistory"/>
</entity>
<entity name="Subscription" representedClassName="CoreDataStack.Subscription" syncable="YES">
<attribute name="activedAt" attributeType="Date" usesScalarValueType="NO"/>
@ -271,6 +259,5 @@
<attribute name="updatedAt" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="url" attributeType="String"/>
<relationship name="followedBy" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="MastodonUser" inverseName="followedTags" inverseEntity="MastodonUser"/>
<relationship name="searchHistories" toMany="YES" deletionRule="Nullify" destinationEntity="SearchHistory" inverseName="hashtag" inverseEntity="SearchHistory"/>
</entity>
</model>

View File

@ -68,7 +68,6 @@ final public class MastodonUser: NSManagedObject {
// one-to-many relationship
@NSManaged public private(set) var statuses: Set<Status>
@NSManaged public private(set) var notifications: Set<Notification>
@NSManaged public private(set) var searchHistories: Set<SearchHistory>
// many-to-many relationship
@NSManaged public private(set) var favourite: Set<Status>
@ -216,28 +215,6 @@ extension MastodonUser {
}
extension MastodonUser {
public func findSearchHistory(
domain: String,
userID: MastodonUser.ID
) -> SearchHistory? {
return searchHistories.first { searchHistory in
return searchHistory.domain == domain
&& searchHistory.userID == userID
}
}
public func findSearchHistory(for user: MastodonUser) -> SearchHistory? {
return searchHistories.first { searchHistory in
return searchHistory.domain == user.domain
&& searchHistory.userID == user.id
}
}
}
// MARK: - AutoGenerateProperty
extension MastodonUser: AutoGenerateProperty {
// sourcery:inline:MastodonUser.AutoGenerateProperty

View File

@ -1,158 +0,0 @@
//
// SearchHistory.swift
// CoreDataStack
//
// Created by sxiaojian on 2021/4/7.
//
import Foundation
import CoreData
public final class SearchHistory: NSManagedObject {
public typealias ID = UUID
// sourcery: autoGenerateProperty
@NSManaged public private(set) var identifier: ID
// sourcery: autoGenerateProperty
@NSManaged public private(set) var domain: String
// sourcery: autoGenerateProperty
@NSManaged public private(set) var userID: MastodonUser.ID
// sourcery: autoGenerateProperty
@NSManaged public private(set) var createAt: Date
// sourcery: autoUpdatableObject, autoGenerateProperty
@NSManaged public private(set) var updatedAt: Date
// many-to-one relationship
// sourcery: autoGenerateRelationship
@NSManaged public private(set) var account: MastodonUser?
// sourcery: autoGenerateRelationship
@NSManaged public private(set) var hashtag: Tag?
// sourcery: autoGenerateRelationship
@NSManaged public private(set) var status: Status?
}
extension SearchHistory {
@discardableResult
public static func insert(
into context: NSManagedObjectContext,
property: Property,
relationship: Relationship
) -> SearchHistory {
let object: SearchHistory = context.insertObject()
object.configure(property: property)
object.configure(relationship: relationship)
return object
}
}
extension SearchHistory: Managed {
public static var defaultSortDescriptors: [NSSortDescriptor] {
return [NSSortDescriptor(keyPath: \SearchHistory.updatedAt, ascending: false)]
}
}
extension SearchHistory {
static func predicate(domain: String) -> NSPredicate {
return NSPredicate(format: "%K == %@", #keyPath(SearchHistory.domain), domain)
}
static func predicate(userID: String) -> NSPredicate {
return NSPredicate(format: "%K == %@", #keyPath(SearchHistory.userID), userID)
}
public static func predicate(domain: String, userID: String) -> NSPredicate {
return NSCompoundPredicate(andPredicateWithSubpredicates: [
predicate(domain: domain),
predicate(userID: userID)
])
}
}
// MARK: - AutoGenerateProperty
extension SearchHistory: AutoGenerateProperty {
// sourcery:inline:SearchHistory.AutoGenerateProperty
// Generated using Sourcery
// DO NOT EDIT
public struct Property {
public let identifier: ID
public let domain: String
public let userID: MastodonUser.ID
public let createAt: Date
public let updatedAt: Date
public init(
identifier: ID,
domain: String,
userID: MastodonUser.ID,
createAt: Date,
updatedAt: Date
) {
self.identifier = identifier
self.domain = domain
self.userID = userID
self.createAt = createAt
self.updatedAt = updatedAt
}
}
public func configure(property: Property) {
self.identifier = property.identifier
self.domain = property.domain
self.userID = property.userID
self.createAt = property.createAt
self.updatedAt = property.updatedAt
}
public func update(property: Property) {
update(updatedAt: property.updatedAt)
}
// sourcery:end
}
// MARK: - AutoGenerateRelationship
extension SearchHistory: AutoGenerateRelationship {
// sourcery:inline:SearchHistory.AutoGenerateRelationship
// Generated using Sourcery
// DO NOT EDIT
public struct Relationship {
public let account: MastodonUser?
public let hashtag: Tag?
public let status: Status?
public init(
account: MastodonUser?,
hashtag: Tag?,
status: Status?
) {
self.account = account
self.hashtag = hashtag
self.status = status
}
}
public func configure(relationship: Relationship) {
self.account = relationship.account
self.hashtag = relationship.hashtag
self.status = relationship.status
}
// sourcery:end
}
// MARK: - AutoUpdatableObject
extension SearchHistory: AutoUpdatableObject {
// sourcery:inline:SearchHistory.AutoUpdatableObject
// Generated using Sourcery
// DO NOT EDIT
public func update(updatedAt: Date) {
if self.updatedAt != updatedAt {
self.updatedAt = updatedAt
}
}
// sourcery:end
}

View File

@ -98,7 +98,6 @@ public final class Status: NSManagedObject {
@NSManaged public private(set) var reblogFrom: Set<Status>
@NSManaged public private(set) var replyFrom: Set<Status>
@NSManaged public private(set) var notifications: Set<Notification>
@NSManaged public private(set) var searchHistories: Set<SearchHistory>
// sourcery: autoUpdatableObject, autoGenerateProperty
@NSManaged public private(set) var updatedAt: Date

View File

@ -31,9 +31,6 @@ public final class Tag: NSManagedObject {
// many-to-many relationship
@NSManaged public private(set) var followedBy: Set<MastodonUser>
// one-to-many relationship
@NSManaged public private(set) var searchHistories: Set<SearchHistory>
}
extension Tag {
@ -216,45 +213,3 @@ extension Tag: AutoUpdatableObject {
}
}
extension Tag {
public func findSearchHistory(domain: String, userID: MastodonUser.ID) -> SearchHistory? {
return searchHistories.first { searchHistory in
return searchHistory.domain == domain
&& searchHistory.userID == userID
}
}
public func findSearchHistory(for user: MastodonUser) -> SearchHistory? {
return searchHistories.first { searchHistory in
return searchHistory.domain == user.domain
&& searchHistory.userID == user.id
}
}
}
public extension Tag {
// func updateHistory(index: Int, day: Date, uses: String, account: String) {
// let histories = self.histories.sorted {
// $0.createAt.compare($1.createAt) == .orderedAscending
// }
// guard index < histories.count else { return }
// let history = histories[index]
// history.update(day: day)
// history.update(uses: uses)
// history.update(accounts: account)
// }
//
// func appendHistory(history: History) {
// self.mutableSetValue(forKeyPath: #keyPath(Tag.histories)).add(history)
// }
//
// func update(url: String) {
// if self.url != url {
// self.url = url
// }
// }
}

View File

@ -1,113 +0,0 @@
//
// Persistence+SearchHistory.swift
// Mastodon
//
// Created by MainasuK on 2022-1-20.
//
import CoreData
import CoreDataStack
import Foundation
import MastodonSDK
extension Persistence.SearchHistory {
public struct PersistContext {
public let entity: Entity
public let me: MastodonUser
public let now: Date
public init(
entity: Entity,
me: MastodonUser,
now: Date
) {
self.entity = entity
self.me = me
self.now = now
}
public enum Entity: Hashable {
case user(MastodonUser)
case hashtag(Tag)
}
}
public struct PersistResult {
public let searchHistory: SearchHistory
public let isNewInsertion: Bool
public init(
searchHistory: SearchHistory,
isNewInsertion: Bool
) {
self.searchHistory = searchHistory
self.isNewInsertion = isNewInsertion
}
}
public static func createOrMerge(
in managedObjectContext: NSManagedObjectContext,
context: PersistContext
) -> PersistResult {
if let old = fetch(in: managedObjectContext, context: context) {
update(searchHistory: old, context: context)
return PersistResult(searchHistory: old, isNewInsertion: false)
} else {
let object = create(in: managedObjectContext, context: context)
return PersistResult(searchHistory: object, isNewInsertion: true)
}
}
}
extension Persistence.SearchHistory {
public static func fetch(
in managedObjectContext: NSManagedObjectContext,
context: PersistContext
) -> SearchHistory? {
switch context.entity {
case .user(let user):
return user.findSearchHistory(for: context.me)
case .hashtag(let hashtag):
return hashtag.findSearchHistory(for: context.me)
}
}
@discardableResult
public static func create(
in managedObjectContext: NSManagedObjectContext,
context: PersistContext
) -> SearchHistory {
let property = SearchHistory.Property(
identifier: UUID(),
domain: context.me.domain,
userID: context.me.id,
createAt: context.now,
updatedAt: context.now
)
let relationship: SearchHistory.Relationship = {
switch context.entity {
case .user(let user):
return SearchHistory.Relationship(account: user, hashtag: nil, status: nil)
case .hashtag(let hashtag):
return SearchHistory.Relationship(account: nil, hashtag: hashtag, status: nil)
}
}()
let searchHistory = SearchHistory.insert(
into: managedObjectContext,
property: property,
relationship: relationship
)
update(searchHistory: searchHistory, context: context)
return searchHistory
}
private static func update(
searchHistory: SearchHistory,
context: PersistContext
) {
searchHistory.update(updatedAt: context.now)
}
}