Skip to content

Commit

Permalink
fix(addressbook(dav)): improve handling of addressbook-query
Browse files Browse the repository at this point in the history
  • Loading branch information
cgx committed Feb 28, 2022
1 parent 3f93e6e commit 7faab91
Show file tree
Hide file tree
Showing 12 changed files with 711 additions and 176 deletions.
5 changes: 4 additions & 1 deletion SOPE/GDLContentStore/EOQualifier+GCS.h
Expand Up @@ -25,10 +25,13 @@
#include <EOControl/EOQualifier.h>

@class NSMutableString;
@class EOAdaptor;

@interface EOQualifier(GCS)

- (void) _gcsAppendToString: (NSMutableString *) _ms;
- (void) appendSQLToString: (NSMutableString *) _ms;
- (void) appendSQLToString: (NSMutableString *) _ms
withAdaptor: (EOAdaptor *) _adaptor;

@end

Expand Down
78 changes: 63 additions & 15 deletions SOPE/GDLContentStore/EOQualifier+GCS.m
Expand Up @@ -24,6 +24,10 @@
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>

#import <GDLAccess/EOAdaptor.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOSQLExpression.h>

#import "EOQualifier+GCS.h"

#if (defined(__GNU_LIBOBJC__) && (__GNU_LIBOBJC__ >= 20100911)) || defined(APPLE_RUNTIME) || defined(__GNUSTEP_RUNTIME__)
Expand All @@ -33,9 +37,9 @@
@implementation EOQualifier(GCS)

- (void) _appendAndQualifier: (EOAndQualifier *) _q
withAdaptor: (EOAdaptor *) _adaptor
toString: (NSMutableString *) _ms
{
// TODO: move to EOQualifier category
NSArray *qs;
unsigned i, count;

Expand All @@ -46,14 +50,15 @@ - (void) _appendAndQualifier: (EOAndQualifier *) _q
for (i = 0; i < count; i++) {
if (i != 0) [_ms appendString:@" AND "];
if (count > 1) [_ms appendString:@"("];
[[qs objectAtIndex:i] _gcsAppendToString: _ms];
[[qs objectAtIndex:i] appendSQLToString: _ms
withAdaptor: _adaptor];
if (count > 1) [_ms appendString:@")"];
}
}
- (void)_appendOrQualifier: (EOAndQualifier *) _q
toString: (NSMutableString *) _ms
- (void) _appendOrQualifier: (EOAndQualifier *) _q
withAdaptor: (EOAdaptor *) _adaptor
toString: (NSMutableString *) _ms
{
// TODO: move to EOQualifier category
NSArray *qs;
unsigned i, count;

Expand All @@ -64,23 +69,28 @@ - (void)_appendOrQualifier: (EOAndQualifier *) _q
for (i = 0; i < count; i++) {
if (i != 0) [_ms appendString:@" OR "];
if (count > 1) [_ms appendString:@"("];
[[qs objectAtIndex:i] _gcsAppendToString: _ms];
[[qs objectAtIndex:i] appendSQLToString: _ms
withAdaptor: _adaptor];
if (count > 1) [_ms appendString:@")"];
}
}

- (void)_appendNotQualifier: (EONotQualifier *)_q
toString:(NSMutableString *) _ms
- (void) _appendNotQualifier: (EONotQualifier *) _q
withAdaptor: (EOAdaptor *) _adaptor
toString:(NSMutableString *) _ms
{
[_ms appendString:@" NOT ("];
[[_q qualifier] _gcsAppendToString: _ms];
[[_q qualifier] appendSQLToString: _ms
withAdaptor: _adaptor];
[_ms appendString:@")"];
}

- (void) _appendKeyValueQualifier: (EOKeyValueQualifier *) _q
withAdaptor: (EOAdaptor *) _adaptor
toString: (NSMutableString *) _ms
{
id val;
EOAttribute *attribute;
NSString *qKey, *qOperator, *qValue, *qFormat;
BOOL isCI;

Expand Down Expand Up @@ -119,9 +129,33 @@ - (void) _appendKeyValueQualifier: (EOKeyValueQualifier *) _q
qValue = [val stringValue];
else if ([val isKindOfClass: [NSString class]]) {
if ([(EOKeyValueQualifier *)self formatted])
qValue = val;
{
qValue = val;
}
else
qValue = [NSString stringWithFormat: @"'%@'", val];
{
if (_adaptor)
{
// Assume qualifier applies to a varchar column type
attribute = [EOAttribute new];
[attribute setExternalType: @"varchar"];
[attribute autorelease];

if (sel_isEqual([_q selector], EOQualifierOperatorLike) ||
sel_isEqual([_q selector], EOQualifierOperatorCaseInsensitiveLike))
{
qValue = [[_adaptor expressionClass] sqlPatternFromShellPattern: val];
qValue = [_adaptor formatValue: qValue
forAttribute: attribute];
}
else
qValue = [_adaptor formatValue: val
forAttribute: attribute];
}
else
// No adaptor provided, don't parse value
qValue = [NSString stringWithFormat: @"'%@'", val];
}
}
else {
qValue = @"NULL";
Expand Down Expand Up @@ -155,29 +189,43 @@ - (void) _appendKeyValueQualifier: (EOKeyValueQualifier *) _q
}

- (void) _appendQualifier: (EOQualifier *) _q
withAdaptor: (EOAdaptor *) _adaptor
toString: (NSMutableString *) _ms
{
if (_q == nil) return;

if ([_q isKindOfClass: [EOAndQualifier class]])
[self _appendAndQualifier: (id)_q
withAdaptor: _adaptor
toString: _ms];
else if ([_q isKindOfClass: [EOOrQualifier class]])
[self _appendOrQualifier: (id)_q
toString:_ms];
withAdaptor: _adaptor
toString: _ms];
else if ([_q isKindOfClass: [EOKeyValueQualifier class]])
[self _appendKeyValueQualifier: (id)_q
toString:_ms];
withAdaptor: _adaptor
toString: _ms];
else if ([_q isKindOfClass: [EONotQualifier class]])
[self _appendNotQualifier: (id)_q
toString:_ms];
withAdaptor: (EOAdaptor *) _adaptor
toString: _ms];
else
[self errorWithFormat:@"unknown qualifier: %@", _q];
}

- (void) _gcsAppendToString: (NSMutableString *) _ms
- (void) appendSQLToString: (NSMutableString *) _ms
{
[self _appendQualifier: self
withAdaptor: nil
toString: _ms];
}

- (void) appendSQLToString: (NSMutableString *) _ms
withAdaptor: (EOAdaptor *) _adaptor
{
[self _appendQualifier: self
withAdaptor: _adaptor
toString: _ms];
}

Expand Down
4 changes: 0 additions & 4 deletions SOPE/GDLContentStore/GCSFolder.h
Expand Up @@ -159,10 +159,6 @@
/* helpers */

- (EOAttribute *) _attributeForColumn: (NSString *) _field;
- (void) _findQualifiers: (id) qualifier
withAdaptor: (EOAdaptor *) adaptor;
- (void) _formatQualifierValue: (EOKeyValueQualifier *) qualifier
withAdaptor: (EOAdaptor *) adaptor;
@end

#endif /* __GDLContentStore_GCSFolder_H__ */
63 changes: 5 additions & 58 deletions SOPE/GDLContentStore/GCSFolder.m
@@ -1,7 +1,7 @@
/*
Copyright (C) 2004-2007 SKYRIX Software AG
Copyright (C) 2007 Helge Hess
Copyright (c) 2008-2019 Inverse inc.
Copyright (c) 2008-2022 Inverse inc.
This file is part of SOGo.
Expand All @@ -26,9 +26,11 @@

#import <EOControl/EOFetchSpecification.h>
#import <EOControl/EOSortOrdering.h>
#import <EOControl/EOQualifier.h>

#import <GDLAccess/EOEntity.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOSQLExpression.h>
#import <GDLAccess/EOSQLQualifier.h>
#import <GDLAccess/EOAdaptor.h>
#import <GDLAccess/EOAdaptorContext.h>
Expand Down Expand Up @@ -401,71 +403,16 @@ - (NSString *) _sqlForQualifier: (EOQualifier *) qualifier
adaptor = [adaptorCtx adaptor];
}

if ([qualifier isKindOfClass: [EOAndQualifier class]])
[self _findQualifiers: (id)qualifier withAdaptor: adaptor];
else if ([qualifier isKindOfClass: [EOOrQualifier class]])
[self _findQualifiers: (id)qualifier withAdaptor: adaptor];
else if ([qualifier isKindOfClass: [EOKeyValueQualifier class]])
[self _formatQualifierValue: (EOKeyValueQualifier *)qualifier withAdaptor: adaptor];
else if ([qualifier isKindOfClass: [EONotQualifier class]])
[self _formatQualifierValue: (EOKeyValueQualifier *)[(id)qualifier qualifier] withAdaptor: adaptor];
else
[self errorWithFormat:@"unknown qualifier: %@", qualifier];

ms = [NSMutableString stringWithCapacity:32];
[qualifier _gcsAppendToString: ms];
[qualifier appendSQLToString: ms
withAdaptor: adaptor];
}
else
ms = nil;

return ms;
}

- (void) _findQualifiers: (id) qualifier
withAdaptor: (EOAdaptor *) adaptor
{
NSArray *qs;
unsigned i, count;

if (qualifier == nil) return;

qs = [qualifier qualifiers];
if ((count = [qs count]) == 0)
return;

for (i = 0; i < count; i++) {
id q = [qs objectAtIndex: i];
if ([q isKindOfClass: [EOAndQualifier class]])
[self _findQualifiers: q withAdaptor: adaptor];
else if ([q isKindOfClass:[EOOrQualifier class]])
[self _findQualifiers: q withAdaptor: adaptor];
else if ([q isKindOfClass:[EOKeyValueQualifier class]])
[self _formatQualifierValue: (EOKeyValueQualifier *)q withAdaptor: adaptor];
else if ([q isKindOfClass:[EONotQualifier class]])
[self _formatQualifierValue: (EOKeyValueQualifier *)[q qualifier] withAdaptor: adaptor];
else
[self errorWithFormat:@"unknown qualifier: %@", q];
}
}

- (void) _formatQualifierValue: (EOKeyValueQualifier *) qualifier
withAdaptor: (EOAdaptor *) adaptor
{
NSString *field;
EOAttribute *attribute;
NSString *formattedValue;

field = [qualifier key];
attribute = [self _attributeForColumn: field];
if (attribute && [[qualifier value] isNotNull])
{
formattedValue = [adaptor formatValue: [qualifier value]
forAttribute: attribute];
[qualifier setValue: formattedValue];
[qualifier setFormatted: YES];
}
}

- (NSString *)_sqlForSortOrderings:(NSArray *)_so {
NSMutableString *sql;
unsigned i, count;
Expand Down
22 changes: 21 additions & 1 deletion SoObjects/Contacts/SOGoContactFolder.h
@@ -1,5 +1,5 @@
/*
Copyright (C) 2006-2017 Inverse inc.
Copyright (C) 2006-2022 Inverse inc.
This file is part of SOGo.
Expand Down Expand Up @@ -34,6 +34,8 @@

#import <SOGo/SOGoFolder.h>

@class EOQualifier;
@class EOSortOrdering;
@class NSArray;
@class NSDictionary;
@class NSString;
Expand All @@ -46,8 +48,26 @@
sortBy: (NSString *) sortKey
ordering: (NSComparisonResult) sortOrdering
inDomain: (NSString *) domain;
- (NSArray *) lookupContactsWithQualifier: (EOQualifier *) qualifier
andSortOrdering: (EOSortOrdering *) ordering
inDomain: (NSString *) domain;
- (NSDictionary *) lookupContactWithName: (NSString *) aName;

/**
Map a vCard property to a source field name.
Possible vCard properties are:
- EMAIL
- FN
- N
- ORG
- ADR
- TEL
*/
- (void) addVCardProperty: (NSString *) property
toCriteria: (NSMutableArray *) criteria;

@end

#endif /* __Contacts_SOGoContactFolder_H__ */

0 comments on commit 7faab91

Please sign in to comment.