nano-store 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/Gemfile.lock +3 -3
  2. data/Rakefile +1 -1
  3. data/lib/nano_store/finder.rb +12 -6
  4. data/lib/nano_store/version.rb +1 -1
  5. data/vendor/Podfile.lock +2 -2
  6. data/vendor/Pods/Headers/NanoStore/NSFNanoBag.h +8 -2
  7. data/vendor/Pods/Headers/NanoStore/NSFNanoSearch.h +2 -0
  8. data/vendor/Pods/Headers/NanoStore/NSFNanoStore_Private.h +1 -1
  9. data/vendor/Pods/NanoStore/Classes/Private/NSFNanoStore_Private.h +1 -1
  10. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoBag.h +8 -2
  11. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoBag.m +7 -4
  12. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoExpression.m +2 -6
  13. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoSearch.h +2 -0
  14. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoSearch.m +9 -7
  15. data/vendor/Pods/NanoStore/Classes/Public/NSFNanoStore.m +14 -4
  16. data/vendor/Pods/Pods.bridgesupport +8 -1
  17. metadata +8 -43
  18. data/vendor/NanoStore/Classes/Advanced/NSFNanoEngine.h +0 -542
  19. data/vendor/NanoStore/Classes/Advanced/NSFNanoEngine.m +0 -1781
  20. data/vendor/NanoStore/Classes/Advanced/NSFNanoResult.h +0 -137
  21. data/vendor/NanoStore/Classes/Advanced/NSFNanoResult.m +0 -265
  22. data/vendor/NanoStore/Classes/Private/NSFNanoBag_Private.h +0 -37
  23. data/vendor/NanoStore/Classes/Private/NSFNanoEngine_Private.h +0 -69
  24. data/vendor/NanoStore/Classes/Private/NSFNanoExpression_Private.h +0 -35
  25. data/vendor/NanoStore/Classes/Private/NSFNanoGlobals_Private.h +0 -99
  26. data/vendor/NanoStore/Classes/Private/NSFNanoObject_Private.h +0 -35
  27. data/vendor/NanoStore/Classes/Private/NSFNanoPredicate_Private.h +0 -35
  28. data/vendor/NanoStore/Classes/Private/NSFNanoResult_Private.h +0 -43
  29. data/vendor/NanoStore/Classes/Private/NSFNanoSearch_Private.h +0 -48
  30. data/vendor/NanoStore/Classes/Private/NSFNanoStore_Private.h +0 -57
  31. data/vendor/NanoStore/Classes/Private/NanoStore_Private.h +0 -37
  32. data/vendor/NanoStore/Classes/Public/NSFNanoBag.h +0 -306
  33. data/vendor/NanoStore/Classes/Public/NSFNanoBag.m +0 -485
  34. data/vendor/NanoStore/Classes/Public/NSFNanoExpression.h +0 -125
  35. data/vendor/NanoStore/Classes/Public/NSFNanoExpression.m +0 -103
  36. data/vendor/NanoStore/Classes/Public/NSFNanoGlobals.h +0 -323
  37. data/vendor/NanoStore/Classes/Public/NSFNanoGlobals.m +0 -145
  38. data/vendor/NanoStore/Classes/Public/NSFNanoObject.h +0 -298
  39. data/vendor/NanoStore/Classes/Public/NSFNanoObject.m +0 -187
  40. data/vendor/NanoStore/Classes/Public/NSFNanoObjectProtocol.h +0 -119
  41. data/vendor/NanoStore/Classes/Public/NSFNanoPredicate.h +0 -123
  42. data/vendor/NanoStore/Classes/Public/NSFNanoPredicate.m +0 -130
  43. data/vendor/NanoStore/Classes/Public/NSFNanoSearch.h +0 -381
  44. data/vendor/NanoStore/Classes/Public/NSFNanoSearch.m +0 -835
  45. data/vendor/NanoStore/Classes/Public/NSFNanoSortDescriptor.h +0 -124
  46. data/vendor/NanoStore/Classes/Public/NSFNanoSortDescriptor.m +0 -79
  47. data/vendor/NanoStore/Classes/Public/NSFNanoStore.h +0 -475
  48. data/vendor/NanoStore/Classes/Public/NSFNanoStore.m +0 -1375
  49. data/vendor/NanoStore/Classes/Public/NanoStore.h +0 -463
  50. data/vendor/NanoStore/LICENSE +0 -25
  51. data/vendor/NanoStore/NanoStore.bridgesupport +0 -1215
  52. data/vendor/NanoStore/README.md +0 -411
@@ -1,119 +0,0 @@
1
- /*
2
- NSFNanoObjectProtocol.h
3
- NanoStore
4
-
5
- Copyright (c) 2010 Webbo, L.L.C. All rights reserved.
6
-
7
- Redistribution and use in source and binary forms, with or without modification, are permitted
8
- provided that the following conditions are met:
9
-
10
- * Redistributions of source code must retain the above copyright notice, this list of conditions
11
- and the following disclaimer.
12
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
13
- and the following disclaimer in the documentation and/or other materials provided with the distribution.
14
- * Neither the name of Webbo nor the names of its contributors may be used to endorse or promote
15
- products derived from this software without specific prior written permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
18
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
20
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
- SUCH DAMAGE.
25
- */
26
-
27
- /*! @file NSFNanoObjectProtocol.h
28
- @brief A protocol declaring the interface that objects interfacing with NanoStore must implement.
29
- */
30
-
31
- /** @protocol NSFNanoObjectProtocol
32
- * A protocol declaring the interface that objects interfacing with NanoStore must implement.
33
- *
34
- * @note
35
- * Check NSFNanoBag or NSFNanoObject to see a concrete example of how NSFNanoObjectProtocol is implemented.
36
- */
37
-
38
- @class NSFNanoStore;
39
-
40
- @protocol NSFNanoObjectProtocol
41
-
42
- @required
43
-
44
- /** * Initializes a newly allocated object containing a given key and value associated with a document store.
45
- * @param theDictionary the information associated with the object.
46
- * @param aKey the key associated with the information.
47
- * @param theStore the document store where the object is stored.
48
- * @return An initialized object upon success, nil otherwise.
49
- * @details <b>Example:</b>
50
- @code
51
- - (id)initNanoObjectFromDictionaryRepresentation:(NSDictionary *)aDictionary forKey:(NSString *)aKey store:(NSFNanoStore *)aStore
52
- {
53
- if (self = [self init]) {
54
- info = [aDictionary retain];
55
- key = [aKey copy];
56
- }
57
-
58
- return self;
59
- }
60
- @endcode
61
- */
62
-
63
- - (id)initNanoObjectFromDictionaryRepresentation:(NSDictionary *)theDictionary forKey:(NSString *)aKey store:(NSFNanoStore *)theStore;
64
-
65
- /** * Returns a dictionary that contains the information stored in the object.
66
- * @see \link nanoObjectKey - (NSString *)nanoObjectKey \endlink
67
- */
68
-
69
- - (NSDictionary *)nanoObjectDictionaryRepresentation;
70
-
71
- /** * Returns the key associated with the object.
72
- * @note
73
- * The class NSFNanoEngine contains a convenience method for this purpose: \ref NSFNanoEngine::stringWithUUID "+(NSString*)stringWithUUID"
74
- *
75
- * @see \link nanoObjectDictionaryRepresentation - (NSDictionary *)nanoObjectDictionaryRepresentation \endlink
76
- */
77
-
78
- - (NSString *)nanoObjectKey;
79
-
80
- /** * Returns a reference to the object holding the private data or information that will be used for sorting.
81
- * Most custom objects will return <i>self</i>, as is the case for NSFNanoBag. Since we can sort a bag by <i>name</i>, <i>key</i> or <i>hasUnsavedChanges</i>,
82
- * NanoStore requires a hint to find the attribute. This hint is the root object, which KVC uses to perform the sort. Taking NSFNanoBag as an example:
83
- @code
84
- @interface NSFNanoBag : NSObject <NSFNanoObjectProtocol, NSCopying>
85
- {
86
- NSFNanoStore *store;
87
- NSString *name;
88
- NSString *key;
89
- BOOL hasUnsavedChanges;
90
- }
91
- @endcode
92
- * The implementation of <i>rootObject</i> would look like so:
93
- @code
94
- - (id)rootObject
95
- {
96
- return self;
97
- }
98
- @endcode
99
- * Other objects may point directly to the collection that holds the information. NSFNanoObject stores all its data in the <i>info</i> dictionary, so the
100
- * implementation looks like this:
101
- @code
102
- - (id)rootObject
103
- {
104
- return info;
105
- }
106
- @endcode
107
- * Assuming that <i>info</i> contains a key named <i>City</i>, we would specify a NSFNanoSortDescriptor which would sort the cities like so:
108
- @code
109
- NSFNanoSortDescriptor *sortedCities = [[NSFNanoSortDescriptor alloc]initWithAttribute:@"City" ascending:YES];
110
- @endcode
111
- * If we had returned <i>self</i> as the root object, the sort descriptor would have to be written like so:
112
- @code
113
- NSFNanoSortDescriptor *sortedCities = [[NSFNanoSortDescriptor alloc]initWithAttribute:@"info.City" ascending:YES];
114
- @endcode
115
- */
116
-
117
- - (id)rootObject;
118
-
119
- @end
@@ -1,123 +0,0 @@
1
- /*
2
- NSFNanoPredicate.h
3
- NanoStore
4
-
5
- Copyright (c) 2010 Webbo, L.L.C. All rights reserved.
6
-
7
- Redistribution and use in source and binary forms, with or without modification, are permitted
8
- provided that the following conditions are met:
9
-
10
- * Redistributions of source code must retain the above copyright notice, this list of conditions
11
- and the following disclaimer.
12
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
13
- and the following disclaimer in the documentation and/or other materials provided with the distribution.
14
- * Neither the name of Webbo nor the names of its contributors may be used to endorse or promote
15
- products derived from this software without specific prior written permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
18
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
20
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
- SUCH DAMAGE.
25
- */
26
-
27
- /*! @file NSFNanoPredicate.h
28
- @brief A predicate is an element of an expression used to perform complex queries.
29
- */
30
-
31
- /** @class NSFNanoPredicate
32
- * A predicate is an element of an expression used to perform complex queries.
33
- *
34
- * @note
35
- * A predicate must be added to a NSFNanoExpression.
36
- *
37
- * @details <b>Example:</b>
38
- @code
39
- // Instantiate a NanoStore and open it
40
- NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
41
-
42
- // Add some data to the document store
43
- NSDictionary *info = ...;
44
- NSFNanoObject *object = [NSFNanoObject nanoObjectWithDictionary:info];
45
- [nanoStore addObject:object error:nil];
46
-
47
- // Prepare the expression
48
- NSFNanoPredicate *attribute = [NSFNanoPredicate predicateWithColumn:NSFAttributeColumn matching:NSFEqualTo value:@"FirstName"];
49
- NSFNanoPredicate *value = [NSFNanoPredicate predicateWithColumn:NSFValueColumn matching:NSFEqualTo value:@"Hobbes"];
50
- NSFNanoExpression *expression = [NSFNanoExpression expressionWithPredicate:predicateAttribute];
51
- [expression addPredicate:predicateValue withOperator:NSFAnd];
52
-
53
- // Setup the search with the document store and a given expression
54
- NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
55
- [search setExpressions:[NSArray arrayWithObject:expression]];
56
-
57
- // Obtain the matching objects
58
- NSDictionary *searchResults = [search searchObjectsWithReturnType:NSFReturnObjects error:nil];
59
-
60
- // Close the document store
61
- [nanoStore closeWithError:nil];
62
- @endcode
63
- *
64
- * @see \link NSFNanoExpression::expressionWithPredicate: + (NSFNanoExpression*)expressionWithPredicate:(NSFNanoPredicate *)thePredicate \endlink
65
- * @see \link NSFNanoExpression::initWithPredicate: - (id)initWithPredicate:(NSFNanoPredicate *)thePredicate \endlink
66
- * @see \link NSFNanoExpression::addPredicate:withOperator: - (void)addPredicate:(NSFNanoPredicate *)thePredicate withOperator:(NSFOperator)theOperator \endlink
67
- */
68
-
69
- #import <Foundation/Foundation.h>
70
-
71
- #import "NSFNanoGlobals.h"
72
-
73
- @interface NSFNanoPredicate : NSObject
74
-
75
- /** * The type of column being referenced. */
76
- @property (nonatomic, assign, readonly) NSFTableColumnType column;
77
- /** * The comparison operator to be used. */
78
- @property (nonatomic, assign, readonly) NSFMatchType match;
79
- /** * The value to be used for comparison. */
80
- @property (nonatomic, copy, readonly) NSString *value;
81
-
82
- /** @name Creating and Initializing a Predicate
83
- */
84
-
85
- //@{
86
-
87
- /** * Creates and returns a predicate.
88
- * @param theType is the column type. Can be \link Globals::NSFKeyColumn NSFKeyColumn \endlink, \link Globals::NSFAttributeColumn NSFAttributeColumn \endlink or \link Globals::NSFValueColumn NSFValueColumn \endlink.
89
- * @param theMatch is the match operator.
90
- * @param theValue is the value.
91
- * @return A predicate which can be used in an NSFNanoExpression.
92
- * @see \link initWithColumn:matching:value: - (id)initWithColumn:(NSFTableColumnType)theType matching:(NSFMatchType)theMatch value:(NSString *)theValue \endlink
93
- */
94
-
95
- + (NSFNanoPredicate*)predicateWithColumn:(NSFTableColumnType)theType matching:(NSFMatchType)theMatch value:(NSString *)theValue;
96
-
97
- /** * Initializes a newly allocated predicate.
98
- * @param theType is the column type. Can be \link Globals::NSFKeyColumn NSFKeyColumn \endlink, \link Globals::NSFAttributeColumn NSFAttributeColumn \endlink or \link Globals::NSFValueColumn NSFValueColumn \endlink.
99
- * @param theMatch is the match operator.
100
- * @param theValue is the value.
101
- * @return A predicate which can be used in an NSFNanoExpression.
102
- * @see \link predicateWithColumn:matching:value: + (NSFNanoPredicate*)predicateWithColumn:(NSFTableColumnType)theType matching:(NSFMatchType)theMatch value:(NSString *)theValue \endlink
103
- */
104
-
105
- - (id)initWithColumn:(NSFTableColumnType)theType matching:(NSFMatchType)theMatch value:(NSString *)theValue;
106
-
107
- //@}
108
-
109
- /** @name Miscellaneous
110
- */
111
-
112
- //@{
113
-
114
- /** * Returns a string representation of the predicate.
115
- * @note Check properties column, match and value to find out the current state of the predicate.
116
- * @see \link description - (NSString *)description \endlink
117
- */
118
-
119
- - (NSString *)description;
120
-
121
- //@}
122
-
123
- @end
@@ -1,130 +0,0 @@
1
- /*
2
- NSFNanoExpression.m
3
- NanoStore
4
-
5
- Copyright (c) 2010 Webbo, L.L.C. All rights reserved.
6
-
7
- Redistribution and use in source and binary forms, with or without modification, are permitted
8
- provided that the following conditions are met:
9
-
10
- * Redistributions of source code must retain the above copyright notice, this list of conditions
11
- and the following disclaimer.
12
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
13
- and the following disclaimer in the documentation and/or other materials provided with the distribution.
14
- * Neither the name of Webbo nor the names of its contributors may be used to endorse or promote
15
- products derived from this software without specific prior written permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
18
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
20
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
- SUCH DAMAGE.
25
- */
26
-
27
- #import "NSFNanoExpression.h"
28
- #import "NanoStore_Private.h"
29
-
30
- @implementation NSFNanoPredicate
31
-
32
- @synthesize column, match, value;
33
-
34
- // ----------------------------------------------
35
- // Initialization / Cleanup
36
- // ----------------------------------------------
37
-
38
- + (NSFNanoPredicate*)predicateWithColumn:(NSFTableColumnType)type matching:(NSFMatchType)matching value:(NSString *)aValue
39
- {
40
- if (nil == aValue)
41
- [[NSException exceptionWithName:NSFUnexpectedParameterException
42
- reason:[NSString stringWithFormat:@"*** -[%@ %s]: value is nil.", [self class], _cmd]
43
- userInfo:nil]raise];
44
-
45
- return [[self alloc]initWithColumn:type matching:matching value:aValue];
46
- }
47
-
48
- - (id)initWithColumn:(NSFTableColumnType)type matching:(NSFMatchType)matching value:(NSString *)aValue
49
- {
50
- if (nil == aValue)
51
- [[NSException exceptionWithName:NSFUnexpectedParameterException
52
- reason:[NSString stringWithFormat:@"*** -[%@ %s]: value is nil.", [self class], _cmd]
53
- userInfo:nil]raise];
54
-
55
- if ((self = [super init])) {
56
- column = type;
57
- match = matching;
58
- value = aValue;
59
- }
60
-
61
- return self;
62
- }
63
-
64
- - (NSString *)description
65
- {
66
- NSMutableString *description = [NSMutableString string];
67
- NSMutableString *mutatedString = nil;
68
- NSInteger mutatedStringLength = 0;
69
- NSString *columnValue = nil;
70
-
71
- switch (column) {
72
- case NSFKeyColumn:
73
- columnValue = NSFKey;
74
- break;
75
- case NSFAttributeColumn:
76
- columnValue = NSFAttribute;
77
- break;
78
- default:
79
- columnValue = NSFValue;
80
- break;
81
- }
82
-
83
- switch (match) {
84
- case NSFEqualTo:
85
- [description appendString:[NSString stringWithFormat:@"%@ = '%@'", columnValue, value]];
86
- break;
87
- case NSFBeginsWith:
88
- mutatedString = [NSMutableString stringWithString:value];
89
- mutatedStringLength = [value length];
90
- [mutatedString replaceCharactersInRange:NSMakeRange(mutatedStringLength - 1, 1) withString:[NSString stringWithFormat:@"%c", [mutatedString characterAtIndex:mutatedStringLength - 1]+1]];
91
- [description appendString:[NSString stringWithFormat:@"(%@ >= '%@' AND %@ < '%@')", columnValue, value, columnValue, mutatedString]];
92
- break;
93
- case NSFContains:
94
- [description appendString:[NSString stringWithFormat:@"%@ GLOB '*%@*'", columnValue, value]];
95
- break;
96
- case NSFEndsWith:
97
- [description appendString:[NSString stringWithFormat:@"%@ GLOB '*%@'", columnValue, value]];
98
- break;
99
- case NSFInsensitiveEqualTo:
100
- [description appendString:[NSString stringWithFormat:@"upper(%@) = '%@'", columnValue, [value uppercaseString]]];
101
- break;
102
- case NSFInsensitiveBeginsWith:
103
- mutatedString = [NSMutableString stringWithString:value];
104
- mutatedStringLength = [value length];
105
- [mutatedString replaceCharactersInRange:NSMakeRange(mutatedStringLength - 1, 1) withString:[NSString stringWithFormat:@"%c", [mutatedString characterAtIndex:mutatedStringLength - 1]+1]];
106
- [description appendString:[NSString stringWithFormat:@"(upper(%@) >= '%@' AND upper(%@) < '%@')", columnValue, [value uppercaseString], columnValue, [mutatedString uppercaseString]]];
107
- break;
108
- case NSFInsensitiveContains:
109
- [description appendString:[NSString stringWithFormat:@"%@ LIKE '%@%@%@'", columnValue, @"%", value, @"%"]];
110
- break;
111
- case NSFInsensitiveEndsWith:
112
- [description appendString:[NSString stringWithFormat:@"%@ LIKE '%@%@'", columnValue, @"%", value]];
113
- break;
114
- case NSFGreaterThan:
115
- [description appendString:[NSString stringWithFormat:@"%@ > '%@'", columnValue, value]];
116
- break;
117
- case NSFLessThan:
118
- [description appendString:[NSString stringWithFormat:@"%@ < '%@'", columnValue, value]];
119
- break;
120
- }
121
-
122
- return description;
123
- }
124
-
125
- /** \cond */
126
-
127
-
128
- /** \endcond */
129
-
130
- @end
@@ -1,381 +0,0 @@
1
- /*
2
- NSFNanoSearch.h
3
- NanoStore
4
-
5
- Copyright (c) 2010 Webbo, L.L.C. All rights reserved.
6
-
7
- Redistribution and use in source and binary forms, with or without modification, are permitted
8
- provided that the following conditions are met:
9
-
10
- * Redistributions of source code must retain the above copyright notice, this list of conditions
11
- and the following disclaimer.
12
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions
13
- and the following disclaimer in the documentation and/or other materials provided with the distribution.
14
- * Neither the name of Webbo nor the names of its contributors may be used to endorse or promote
15
- products derived from this software without specific prior written permission.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
18
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
19
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
20
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23
- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
- SUCH DAMAGE.
25
- */
26
-
27
- /*! @file NSFNanoSearch.h
28
- @brief A unit that provides an API to retrieve data from the document store.
29
- */
30
-
31
- /** @class NSFNanoSearch
32
- * A unit that provides an API to retrieve data from the document store.
33
- *
34
- * The search can be conducted in two ways: programatically via setters or by providing a SQL statement. In both cases,
35
- * it's necessary to indicate which object type should be returned. The type \link Globals::NSFReturnType NSFReturnType \endlink provides two options: \link Globals::NSFReturnObjects NSFReturnObjects \endlink and \link Globals::NSFReturnKeys NSFReturnKeys \endlink.
36
- *
37
- * - \link Globals::NSFReturnObjects NSFReturnObjects \endlink will return a dictionary with the key of the NanoObject (key) and the NanoObject itself (value).
38
- * - \link Globals::NSFReturnKeys NSFReturnKeys \endlink will return an array of NanoObjects.
39
- *
40
- * @par <b>Some observations about retrieving data</b><br>
41
- *
42
- * Given the following data set:
43
- *
44
- * - Number of dictionaries: 3.956
45
- * - Number of attributes: 593.862
46
- *
47
- * The table describing different timings to perform a simple value search (i.e. 'Barcelona') is included below, ordered from fastest to slowest:
48
- *
49
- *<table border="1" cellpadding="5">
50
- *<tr>
51
- *<th>Match type</th>
52
- *<th>Seconds</th>
53
- *</tr>
54
- *<tr><td>Equal to</td><td>0.295</td></tr>
55
- *<tr><td>Begins with</td><td>0.295</td></tr>
56
- *<tr><td>Contains</td><td>1.295</td></tr>
57
- *<tr><td>Contains (insensitive)</td><td>1.339</td></tr>
58
- *<tr><td>Ends with (insensitive)</td><td>1.341</td></tr>
59
- *<tr><td>Ends with</td><td>1.351</td></tr>
60
- *<tr><td>Equal to (insensitive)</td><td>1.890</td></tr>
61
- *<tr><td>Begins with (insensitive)</td><td>2.412</td></tr>
62
- *<tr><td>Greater than</td><td>18.246</td></tr>
63
- *<tr><td>Less than</td><td>27.677</td></tr>
64
- *</table>
65
-
66
- @section wherearetheobjects_sec Where are my objects?
67
-
68
- While NSFNanoStore provides some convenience methods to obtain standard objects (such as objects of type NSFNanoBag), the bulk of the search mechanism is handled by NSFNanoSearch.
69
- The steps involved to perform a search are quite simple:
70
-
71
- - 1) Instantiate a search object
72
- - 2) Configure the search via its accessors
73
- - 3) Obtain the results specifying whether objects or keys should be returned (*)
74
-
75
- (*) Request objects if you're interested in the data. Otherwise, you should request keys if you need to feed the result to another method, such as NSFNanoStore
76
- \link NSFNanoStore::removeObjectsWithKeysInArray:error: -(BOOL)removeObjectsWithKeysInArray:(NSArray *)theKeys error:(out NSError **)outError \endlink method.
77
-
78
- @details <b>Example: finding all objects with the attribute 'LastName' and value 'Doe'.</b>
79
- @code
80
- NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
81
-
82
- search.attribute = @"LastName";
83
- search.match = NSFEqualTo;
84
- search.value = @"Doe";
85
-
86
- // Returns a dictionary with the UUID of the object (key) and the NanoObject (value).
87
- NSDictionary *searchResults = [search searchObjectsWithReturnType:NSFReturnObjects error:nil];
88
- @endcode
89
-
90
- @details <b>Example: removing all objects with the attribute 'LastName' and value 'Doe'.</b>
91
- @code
92
- NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
93
-
94
- search.attribute = @"LastName";
95
- search.match = NSFEqualTo;
96
- search.value = @"Doe";
97
-
98
- // Returns an array of matching UUIDs
99
- NSArray *matchingKeys = [search searchObjectsWithReturnType:NSFReturnKeys error:nil];
100
-
101
- // Remove the NanoObjects matching the selected UUIDs
102
- NSError *outError = nil;
103
- if (YES == [nanoStore removeObjectsWithKeysInArray:matchingKeys error:&outError]) {
104
- NSLog(@"The matching objects have been removed.");
105
- } else {
106
- NSLog(@"An error has occurred while removing the matching objects. Reason: %@", [outError localizedDescription]);
107
- }
108
- @endcode
109
-
110
- Another cool feature is the possibility to invoke aggregated functions (count, avg, min, max and total) on the search results. Using the search snippet above,
111
- calculating the average salary of all people with last name equal to 'Doe' is very easy.
112
-
113
- @details <b>Example: calculating the average salary of all objects with the attribute 'LastName' and value 'Doe'.</b>
114
- @code
115
- NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
116
-
117
- search.attribute = @"LastName";
118
- search.match = NSFEqualTo;
119
- search.value = @"Doe";
120
-
121
- float averageSalary = [[search aggregateOperation:NSFAverage onAttribute:@"Salary"]floatValue];
122
- @endcode
123
-
124
- * @details <b>Example:</b>
125
- @code
126
- // Instantiate a NanoStore and open it
127
- NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
128
-
129
- // Generate a NanoObject with a dictionary and a key
130
- NSString *key = @"ABC-123";
131
- NSDictionary *info = ...;
132
- NSFNanoObject *nanoObject = [NSFNanoObject nanoObjectWithDictionary:info];
133
-
134
- // Add it to the document store
135
- [nanoStore addObject:nanoObject error:nil];
136
-
137
- // Instantiate a search and specify the attribute(s) we want to search for
138
- NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
139
- search.key = key;
140
-
141
- // Perform the search and obtain the results
142
- NSDictionary *searchResults = [search searchObjectsWithReturnType:NSFReturnObjects error:nil];
143
-
144
- // Close the document store
145
- [nanoStore closeWithError:nil];
146
- @endcode
147
- */
148
-
149
- #import <Foundation/Foundation.h>
150
-
151
- #import "NSFNanoGlobals.h"
152
-
153
- @class NSFNanoStore, NSFNanoResult;
154
-
155
- @interface NSFNanoSearch : NSObject
156
-
157
- /** * The document store used for searching. */
158
- @property (nonatomic, weak, readonly) NSFNanoStore *nanoStore;
159
- /** * The set of attributes to be returned on matching objects. */
160
- @property (nonatomic, strong, readwrite) NSArray *attributesToBeReturned;
161
- /** * The key used for searching. */
162
- @property (nonatomic, copy, readwrite) NSString *key;
163
- /** * The attribute used for searching. */
164
- @property (nonatomic, copy, readwrite) NSString *attribute;
165
- /** * The value used for searching. */
166
- @property (nonatomic, copy, readwrite) id value;
167
- /** * The comparison operator used for searching. */
168
- @property (nonatomic, assign, readwrite) NSFMatchType match;
169
- /** * The list of NSFNanoExpression objects used for searching. */
170
- @property (nonatomic, strong, readwrite) NSArray *expressions;
171
- /** * If set to YES, specifying NSFReturnKeys applies the DISTINCT function and groups the values. */
172
- @property (nonatomic, assign, readwrite) BOOL groupValues;
173
- /** * The SQL statement used for searching. Set when executeSQL: is invoked. */
174
- @property (nonatomic, copy, readonly) NSString *sql;
175
- /** * The sort holds an array of one or more sort descriptors of type \link NSFNanoSortDescriptor NSFNanoSortDescriptor \endlink. */
176
- @property (nonatomic, strong, readwrite) NSArray *sort;
177
-
178
- /** @name Creating and Initializing a Search
179
- */
180
-
181
- //@{
182
-
183
- /** * Creates and returns a search element for a given document store.
184
- * @param theNanoStore the document store where the search will be performed. Must not be nil.
185
- * @return An search element upon success, nil otherwise.
186
- * @see \link initWithStore: - (id)initWithStore:(NSFNanoStore *)theNanoStore \endlink
187
- */
188
-
189
- + (NSFNanoSearch *)searchWithStore:(NSFNanoStore *)theNanoStore;
190
-
191
- /** * Initializes a newly allocated search element for a given document store.
192
- * @param theNanoStore the document store where the search will be performed. Must not be nil.
193
- * @return An search element upon success, nil otherwise.
194
- * @see \link searchWithStore: + (NSFNanoSearch *)searchWithStore:(NSFNanoStore *)theNanoStore \endlink
195
- */
196
-
197
- - (id)initWithStore:(NSFNanoStore *)theNanoStore;
198
-
199
- //@}
200
-
201
- /** @name Searching
202
- */
203
-
204
- //@{
205
-
206
- /** * Performs a search using the values of the properties.
207
- * @param theReturnType the type of object to be returned. Can be \link Globals::NSFReturnObjects NSFReturnObjects \endlink or \link Globals::NSFReturnKeys NSFReturnKeys \endlink.
208
- * @param outError is used if an error occurs. May be NULL.
209
- * @return An array is returned if: 1) the sort has been specified or 2) the return type is \link Globals::NSFReturnKeys NSFReturnKeys \endlink. Otherwise, a dictionary is returned.
210
- * @note The sort descriptor will be ignored when returning requesting NSFReturnKeys.
211
- * @see \link searchObjectsAdded:date:returnType:error: - (id)searchObjectsAdded:(NSFDateMatchType)theDateMatch date:(NSDate *)theDate returnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink
212
- */
213
-
214
- - (id)searchObjectsWithReturnType:(NSFReturnType)theReturnType error:(out NSError **)outError;
215
-
216
- /** * Performs a search using the values of the properties before, on or after a given date.
217
- * @param theDateMatch the type of date comparison. Can be \link Globals::NSFBeforeDate NSFBeforeDate \endlink, \link Globals::NSFOnDate NSFOnDate \endlink or \link Globals::NSFAfterDate NSFAfterDate \endlink.
218
- * @param theDate the date to use as a pivot during the search.
219
- * @param theReturnType the type of object to be returned. Can be \link Globals::NSFReturnObjects NSFReturnObjects \endlink or \link Globals::NSFReturnKeys NSFReturnKeys \endlink.
220
- * @param outError is used if an error occurs. May be NULL.
221
- * @return If theReturnType is \link Globals::NSFReturnObjects NSFReturnObjects \endlink, a dictionary is returned. Otherwise, an array is returned.
222
- * @note The sort descriptor will be ignored when returning requesting NSFReturnKeys.
223
- * @see \link searchObjectsWithReturnType:error: - (id)searchObjectsWithReturnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink
224
- */
225
-
226
- - (id)searchObjectsAdded:(NSFDateMatchType)theDateMatch date:(NSDate *)theDate returnType:(NSFReturnType)theReturnType error:(out NSError **)outError;
227
-
228
- /** * Returns the result of the aggregate function.
229
- * @param theFunctionType is the function type to be applied.
230
- * @param theAttribute is the attribute used in the function.
231
- * @returns An NSNumber containing the result of the aggregate function.
232
- * @details <b>Example:</b>
233
- @code
234
- * NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
235
- *
236
- * // Assume we have saved data to the document store
237
- * ...
238
- * ...
239
- *
240
- * // Get the average for the attribute named 'SomeNumber'
241
- * NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
242
- * NSNumber *result = [search aggregateOperation:NSFAverage onAttribute:@"SomeNumber"];
243
- @endcode
244
- @note The sort descriptor will be ignored when executing aggregate operations.
245
- */
246
-
247
- - (NSNumber *)aggregateOperation:(NSFAggregateFunctionType)theFunctionType onAttribute:(NSString *)theAttribute;
248
-
249
- /** * Performs a search with a given SQL statement.
250
- * @param theSQLStatement is the SQL statement to be executed. Must not be nil or an empty string.
251
- * @param theReturnType the type of object to be returned. Can be \link Globals::NSFReturnObjects NSFReturnObjects \endlink or \link Globals::NSFReturnKeys NSFReturnKeys \endlink.
252
- * @param outError is used if an error occurs. May be NULL.
253
- * @return If theReturnType is \link Globals::NSFReturnObjects NSFReturnObjects \endlink, a dictionary is returned. Otherwise, an array is returned.
254
- * @note
255
- * Use this method when performing search on NanoObjects. If you need to perform more advanced SQL statements, you may want to use
256
- * \link executeSQL: - (NSFNanoResult *)executeSQL:(NSString *)theSQLStatement \endlink instead.
257
- * @par
258
- * The key difference between this method and \link executeSQL: - (NSFNanoResult *)executeSQL:(NSString *)theSQLStatement \endlink is that this method performs
259
- * a check to make sure the columns specified match the ones required by the \link Globals::NSFReturnType NSFReturnType \endlink type selected. If the column selection is wrong,
260
- * NanoStore rewrites the query by specifying the right set of columns while honoring the rest of the query.
261
- * @details <b>Example:</b>
262
- * @code
263
- * // Prepare a document store
264
- * NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
265
- *
266
- * // Prepare some data and wrap it in a NanoObject
267
- * NSString *key = @"ABC-123";
268
- * NSDictionary *info = ...;
269
- * NSFNanoObject *nanoObject = [NSFNanoObject nanoObjectWithDictionary:info];
270
- *
271
- * // Add it to the document store
272
- * [nanoStore addObjectsFromArray:[NSArray arrayWithObject:nanoObject] error:nil];
273
- *
274
- * // Instantiate a search and specify the attribute(s) we want to search for
275
- * NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
276
- *
277
- * // Perform the search
278
- * // The query will be rewritten as @"SELECT NSFKey, NSFPlist, NSFObjectClass FROM NSFKeys"
279
- * NSDictionary *results = [search executeSQL:@"SELECT foo, bar FROM NSFKeys" returnType:NSFReturnObjects error:nil];
280
- * @endcode
281
- * @note The sort descriptor will be ignored when executing custom SQL statements.
282
- * @see \link executeSQL: - (NSFNanoResult *)executeSQL:(NSString *)theSQLStatement \endlink
283
- */
284
-
285
- - (id)executeSQL:(NSString *)theSQLStatement returnType:(NSFReturnType)theReturnType error:(out NSError **)outError;
286
-
287
- /** * Performs a search with a given SQL statement.
288
- * @param theSQLStatement is the SQL statement to be executed. Must not be nil or an empty string.
289
- * @return Returns a NSFNanoResult.
290
- * @note
291
- * Use this method when you need to perform more advanced SQL statements. If you just want to query NanoObjects using your own SQL statement,
292
- * you may want to use \link executeSQL:returnType:error: - (id)executeSQL:(NSString *)theSQLStatement returnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink instead.
293
- * @par
294
- * The key difference between this method and \link executeSQL:returnType:error: - (id)executeSQL:(NSString *)theSQLStatement returnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink
295
- * is that this method doesn't perform any check at all. The SQL statement will be sent verbatim to SQLite.
296
- * @details <b>Example:</b>
297
- * @code
298
- * // Prepare a document store
299
- * NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
300
- *
301
- * // Prepare some data and wrap it in a NanoObject
302
- * NSString *key = @"ABC-123";
303
- * NSDictionary *info = ...;
304
- * NSFNanoObject *nanoObject = [NSFNanoObject nanoObjectWithDictionary:info];
305
- *
306
- * // Add it to the document store
307
- * [nanoStore addObjectsFromArray:[NSArray arrayWithObject:nanoObject] error:nil];
308
- *
309
- * // Instantiate a search and specify the attribute(s) we want to search for
310
- * NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
311
- *
312
- * // Perform the search
313
- * NSFNanoResult *result = [search executeSQL:@"SELECT COUNT(*) FROM NSFKEYS"];
314
- * @endcode
315
- * @see \link executeSQL:returnType:error: - (id)executeSQL:(NSString *)theSQLStatement returnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink
316
- * @note The sort descriptor will be ignored when executing custom SQL statements.
317
- */
318
-
319
- - (NSFNanoResult *)executeSQL:(NSString *)theSQLStatement;
320
-
321
- /** * Performs an analysis of the given SQL statement.
322
- * @param theSQLStatement is the SQL statement to be analyzed. Must not be nil or an empty string.
323
- * @return Returns a NSFNanoResult.
324
- * @note
325
- * Returns the sequence of virtual machine instructions with high-level information about what indices would have been used if the SQL statement had
326
- * been executed.
327
- *
328
- * @warning
329
- * The analysis generated by this method is intended for interactive analysis and troubleshooting only. The details of the output format
330
- * are subject to change from one release of SQLite to the next. Applications should not use this method in production code since the exact behavior
331
- * is undocumented, unspecified, and variable.
332
- *
333
- * For additional information about SQLite's Virtual Machine Opcodes, see http://www.sqlite.org/opcode.html
334
- *
335
- * The tutorial Virtual Database Engine of SQLite is available here: http://www.sqlite.org/vdbe.html
336
- *
337
- * @details <b>Example:</b>
338
- * @code
339
- * // Prepare a document store
340
- * NSFNanoStore *nanoStore = [NSFNanoStore createAndOpenStoreWithType:NSFMemoryStoreType path:nil error:nil];
341
- *
342
- * // Instantiate a search object
343
- * NSFNanoSearch *search = [NSFNanoSearch searchWithStore:nanoStore];
344
- *
345
- * // Perform the analysis
346
- * NSFNanoResult *results = [search explainSQL:@"SELECT * FROM NSFValues"];
347
- * @endcode
348
- * @see \link executeSQL: - (NSFNanoResult *)executeSQL:(NSString *)theSQLStatement \endlink
349
- * @see \link executeSQL:returnType:error: - (id)executeSQL:(NSString *)theSQLStatement returnType:(NSFReturnType)theReturnType error:(out NSError **)outError \endlink
350
- */
351
-
352
- - (NSFNanoResult *)explainSQL:(NSString *)theSQLStatement;
353
-
354
- //@}
355
-
356
- /** @name Resetting Values
357
- */
358
-
359
- //@{
360
-
361
- /** * Resets the values to a know, default state.
362
- * - key = nil;
363
- * - attribute = nil;
364
- * - value = nil;
365
- * - match = NSFContains;
366
- * - object type = NSFReturnObjects;
367
- * - groupValues = NO;
368
- * - attributesReturned = nil;
369
- * - type returned = NSFReturnObjects;
370
- * - sql = nil;
371
- * - sort = nil;
372
- *
373
- * @note
374
- * When invoked, it sets the values of search to its initial state. Resetting and performing a search will select all records.
375
- */
376
-
377
- - (void)reset;
378
-
379
- //@}
380
-
381
- @end