Index oversize text for search.

pull/1/head
Matthew Chen 8 years ago
parent a00df83b37
commit e8d0d9ecc0

@ -58,6 +58,9 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)writeData:(NSData *)data error:(NSError **)error;
- (BOOL)writeDataSource:(DataSource *)dataSource;
- (BOOL)isOversizeText;
- (nullable NSString *)readOversizeText;
+ (void)deleteAttachments;
+ (NSString *)attachmentsFolder;

@ -672,6 +672,27 @@ NS_ASSUME_NONNULL_BEGIN
return [OWSBackupFragment fetchObjectWithUniqueID:self.lazyRestoreFragmentId];
}
- (BOOL)isOversizeText
{
return [self.contentType isEqualToString:OWSMimeTypeOversizeTextMessage];
}
- (nullable NSString *)readOversizeText
{
if (!self.isOversizeText) {
OWSFail(@"%@ oversize text attachment has unexpected content type.", self.logTag);
return nil;
}
NSError *error;
NSData *_Nullable data = [self readDataFromFileWithError:&error];
if (error || !data) {
OWSFail(@"%@ could not read oversize text attachment: %@.", self.logTag, error);
return nil;
}
NSString *_Nullable string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return string;
}
#pragma mark - Update With... Methods
- (void)markForLazyRestoreWithFragment:(OWSBackupFragment *)lazyRestoreFragment

@ -194,9 +194,48 @@ public class FullTextSearchFinder: NSObject {
}
private static let messageIndexer: SearchIndexer<TSMessage> = SearchIndexer { (message: TSMessage) in
return message.body ?? ""
if let body = message.body, body.count > 0 {
return body
}
if let oversizeText = oversizeText(forMessage: message) {
return oversizeText
}
return ""
}
private static func oversizeText(forMessage message: TSMessage) -> String? {
guard message.hasAttachments() else {
return nil
}
guard let dbConnection = dbConnection else {
owsFail("Could not load attachment for search indexing.")
return nil
}
var oversizeText: String?
dbConnection.read({ (transaction) in
guard let attachment = message.attachment(with: transaction) else {
owsFail("Could not load attachment for search indexing.")
return
}
guard let attachmentStream = attachment as? TSAttachmentStream else {
return
}
guard attachmentStream.isOversizeText() else {
return
}
Logger.verbose("attachmentStream: \(attachmentStream.contentType)")
Logger.flush()
guard let text = attachmentStream.readOversizeText() else {
owsFail("Could not load oversize text attachment")
return
}
oversizeText = text
})
return oversizeText
}
private static var dbConnection: YapDatabaseConnection?
private class func indexContent(object: Any) -> String? {
if let groupThread = object as? TSGroupThread {
return self.groupThreadIndexer.index(groupThread)
@ -236,6 +275,12 @@ public class FullTextSearchFinder: NSObject {
}
private class var dbExtensionConfig: YapDatabaseFullTextSearch {
SwiftAssertIsOnMainThread(#function)
if dbConnection == nil {
dbConnection = OWSPrimaryStorage.shared().newDatabaseConnection()
}
let contentColumnName = "content"
let handler = YapDatabaseFullTextSearchHandler.withObjectBlock { (dict: NSMutableDictionary, _: String, _: String, object: Any) in

Loading…
Cancel
Save