From 8149042c953afc308a1842feb17b7c580df20e8c Mon Sep 17 00:00:00 2001 From: helge Date: Fri, 27 Aug 2004 20:17:40 +0000 Subject: [PATCH] added ability to sort fetch results in the database git-svn-id: http://svn.opengroupware.org/SOGo/trunk@288 d1b88da0-ebda-0310-925b-ed51d893ca5b --- OGoContentStore/ChangeLog | 8 +++ OGoContentStore/OCSChannelManager.m | 4 +- OGoContentStore/OCSFolder.h | 4 +- OGoContentStore/OCSFolder.m | 79 +++++++++++++++++++++++++++-- OGoContentStore/Version | 4 +- 5 files changed, 92 insertions(+), 7 deletions(-) diff --git a/OGoContentStore/ChangeLog b/OGoContentStore/ChangeLog index 6dde311b..19707fc1 100644 --- a/OGoContentStore/ChangeLog +++ b/OGoContentStore/ChangeLog @@ -1,3 +1,11 @@ +2004-08-27 Helge Hess + + * v0.9.7 + + * OCSChannelManager.m: use PostgreSQL as adaptor, not PostgreSQL72 + + * OCSFolder.m: added support for doing folder sorting in SQL + 2004-08-26 Helge Hess * v0.9.6 diff --git a/OGoContentStore/OCSChannelManager.m b/OGoContentStore/OCSChannelManager.m index f678bd02..0188ad87 100644 --- a/OGoContentStore/OCSChannelManager.m +++ b/OGoContentStore/OCSChannelManager.m @@ -75,8 +75,8 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; } + (NSString *)adaptorNameForURLScheme:(NSString *)_scheme { - // TODO: map scheme to adaptors (eg 'postgresql://' to PostgreSQL72 - return @"PostgreSQL72"; + // TODO: map scheme to adaptors (eg 'postgresql://' to PostgreSQL + return @"PostgreSQL"; } + (id)defaultChannelManager { diff --git a/OGoContentStore/OCSFolder.h b/OGoContentStore/OCSFolder.h index 5e3aad72..267de0ea 100644 --- a/OGoContentStore/OCSFolder.h +++ b/OGoContentStore/OCSFolder.h @@ -26,7 +26,7 @@ #import @class NSString, NSURL, NSNumber, NSArray, NSException, NSMutableString; -@class EOQualifier; +@class EOQualifier, EOFetchSpecification; @class EOAdaptorChannel; @class OCSFolderManager, OCSFolderType, OCSChannelManager; @@ -81,6 +81,8 @@ - (NSException *)writeContent:(NSString *)_content toName:(NSString *)_name; - (NSException *)deleteContentWithName:(NSString *)_name; +- (NSArray *)fetchFields:(NSArray *)_flds + fetchSpecification:(EOFetchSpecification *)_fs; - (NSArray *)fetchFields:(NSArray *)_flds matchingQualifier:(EOQualifier *)_q; @end diff --git a/OGoContentStore/OCSFolder.m b/OGoContentStore/OCSFolder.m index 6fd24ba5..9d38bacb 100644 --- a/OGoContentStore/OCSFolder.m +++ b/OGoContentStore/OCSFolder.m @@ -499,6 +499,50 @@ static BOOL doLogStore = NO; /* SQL generation */ +- (NSString *)generateSQLForSortOrderings:(NSArray *)_so { + NSMutableString *sql; + unsigned i, count; + + if ((count = [_so count]) == 0) + return nil; + + sql = [NSMutableString stringWithCapacity:(count * 16)]; + for (i = 0; i < count; i++) { + EOSortOrdering *so; + NSString *column; + SEL sel; + + so = [_so objectAtIndex:i]; + sel = [so selector]; + column = [self columnNameForFieldName:[so key]]; + + if (i > 0) [sql appendString:@", "]; + + if (sel_eq(sel, EOCompareAscending)) { + [sql appendString:column]; + [sql appendString:@" ASC"]; + } + else if (sel_eq(sel, EOCompareDescending)) { + [sql appendString:column]; + [sql appendString:@" DESC"]; + } + else if (sel_eq(sel, EOCompareCaseInsensitiveAscending)) { + [sql appendString:@"UPPER("]; + [sql appendString:column]; + [sql appendString:@") ASC"]; + } + else if (sel_eq(sel, EOCompareCaseInsensitiveDescending)) { + [sql appendString:@"UPPER("]; + [sql appendString:column]; + [sql appendString:@") DESC"]; + } + else { + [self logWithFormat:@"cannot handle sort selector in store: %@", + NSStringFromSelector(sel)]; + } + } + return sql; +} - (NSString *)generateSQLForQualifier:(EOQualifier *)_q { NSMutableString *ms; @@ -511,7 +555,11 @@ static BOOL doLogStore = NO; /* fetching */ -- (NSArray *)fetchFields:(NSArray *)_flds matchingQualifier:(EOQualifier *)_q { +- (NSArray *)fetchFields:(NSArray *)_flds + fetchSpecification:(EOFetchSpecification *)_fs +{ + EOQualifier *qualifier; + NSArray *sortOrderings; EOAdaptorChannel *channel; NSException *error; NSMutableString *sql; @@ -519,6 +567,9 @@ static BOOL doLogStore = NO; NSMutableArray *results; NSDictionary *row; + qualifier = [_fs qualifier]; + sortOrderings = [_fs sortOrderings]; + #if 0 [self logWithFormat:@"FETCH: %@", _flds]; [self logWithFormat:@" MATCH: %@", _q]; @@ -542,10 +593,19 @@ static BOOL doLogStore = NO; [sql appendString:@" FROM "]; [sql appendString:[self quickTableName]]; - if (_q != nil) { + if (qualifier != nil) { [sql appendString:@" WHERE "]; - [sql appendString:[self generateSQLForQualifier:_q]]; + [sql appendString:[self generateSQLForQualifier:qualifier]]; + } + if ([sortOrderings count] > 0) { + [sql appendString:@" ORDER BY "]; + [sql appendString:[self generateSQLForSortOrderings:sortOrderings]]; } +#if 0 + /* limit */ + [sql appendString:@" LIMIT "]; // count + [sql appendString:@" OFFSET "]; // index from 0 +#endif /* open channel */ @@ -576,6 +636,19 @@ static BOOL doLogStore = NO; return results; } +- (NSArray *)fetchFields:(NSArray *)_flds matchingQualifier:(EOQualifier *)_q { + EOFetchSpecification *fs; + + if (_q == nil) + fs = nil; + else { + fs = [EOFetchSpecification fetchSpecificationWithEntityName: + [self folderName] + qualifier:_q + sortOrderings:nil]; + } + return [self fetchFields:_flds fetchSpecification:fs]; +} /* description */ diff --git a/OGoContentStore/Version b/OGoContentStore/Version index 8e956c34..1a549310 100644 --- a/OGoContentStore/Version +++ b/OGoContentStore/Version @@ -2,4 +2,6 @@ MAJOR_VERSION=0 MINOR_VERSION=9 -SUBMINOR_VERSION:=6 +SUBMINOR_VERSION:=7 + +# v0.9.7 requires libGDLAccess v1.1.35 -- 2.39.5