Line data Source code
1 : import 'package:freezed_annotation/freezed_annotation.dart';
2 :
3 : part 'predicate.freezed.dart';
4 :
5 : ///Predicate model
6 : ///
7 : ///Create a new Predicate that handle the data for
8 : ///querying.
9 : @freezed
10 : class Predicate with _$Predicate {
11 : ///General predicates
12 :
13 : ///Any
14 : factory Predicate.any(PredicatePath path, List<String> values) = AnyPredicate;
15 :
16 : ///At
17 : factory Predicate.at(PredicatePath path, String value) = AtPredicate;
18 :
19 : ///FullText
20 : factory Predicate.fullText(PredicatePath path, String value) =
21 : FullTextPredicate;
22 :
23 : ///Greater than
24 : factory Predicate.gt(PredicatePath path, double value) = GtPredicate;
25 :
26 : ///Has
27 : factory Predicate.has(PredicatePath path) = HasPredicate;
28 :
29 : ///In Range
30 : factory Predicate.inRange(
31 : PredicatePath path, double lowerLimit, double upperLimit) =
32 : InRangePredicate;
33 :
34 : ///In
35 : factory Predicate.into(PredicatePath path, List<String> values) = InPredicate;
36 :
37 : ///Less than
38 : factory Predicate.lt(PredicatePath path, double value) = LtPredicate;
39 :
40 : ///Missing
41 : factory Predicate.missing(PredicatePath path) = MissingPredicate;
42 :
43 : ///Near
44 : factory Predicate.near(PredicatePath path, double latitude, double longitude,
45 : double radius) = NearPredicate;
46 :
47 : ///Not
48 : factory Predicate.not(PredicatePath path, String value) = NotPredicate;
49 :
50 : ///Similar
51 : factory Predicate.similar(String id, int value) = SimilarPredicate;
52 :
53 : ///Date/Time predicates
54 :
55 : ///After
56 : factory Predicate.dateAfter(PredicatePath path, int epoch) =
57 : DateAfterPredicate;
58 :
59 : ///Before
60 : factory Predicate.dateBefore(PredicatePath path, int epoch) =
61 : DateBeforePredicate;
62 :
63 : ///Between
64 : factory Predicate.dateBetween(
65 : PredicatePath path, int startEpoch, int endEpoch) = DateBetweenPredicate;
66 :
67 : ///Day of month
68 : factory Predicate.dateDayOfMonth(PredicatePath path, int day) =
69 : DateDayOfMonthPredicate;
70 :
71 : ///Day of mont after
72 : factory Predicate.dateDayOfMonthAfter(PredicatePath path, int day) =
73 : DateDayOfMonthAfterPredicate;
74 :
75 : ///Day of mont before
76 : factory Predicate.dateDayOfMonthBefore(PredicatePath path, int day) =
77 : DateDayOfMonthBeforePredicate;
78 :
79 : ///Day of week
80 : factory Predicate.dateDayOfWeek(PredicatePath path, String day) =
81 : DateDayOfWeekPredicate;
82 :
83 : ///Day of week after
84 : factory Predicate.dateDayOfWeekAfter(PredicatePath path, String day) =
85 : DateDayOfWeekAfterPredicate;
86 :
87 : ///Day of week before
88 : factory Predicate.dateDayOfWeekBefore(PredicatePath path, String day) =
89 : DateDayOfWeekBeforePredicate;
90 :
91 : ///Day of month
92 : factory Predicate.dateMonth(PredicatePath path, String month) =
93 : DateMonthPredicate;
94 :
95 : ///Day of month after
96 : factory Predicate.dateMonthAfter(PredicatePath path, String month) =
97 : DateMonthAfterPredicate;
98 :
99 : ///Day of month before
100 : factory Predicate.dateMonthBefore(PredicatePath path, String month) =
101 : DateMonthBeforePredicate;
102 :
103 : ///Year
104 : factory Predicate.dateYear(PredicatePath path, int year) = DateYearPredicate;
105 :
106 : ///Hour
107 : factory Predicate.hour(PredicatePath path, int hour) = DateHourPredicate;
108 :
109 : ///Hour after
110 : factory Predicate.hourAfter(PredicatePath path, int hour) =
111 : DateHourAfterPredicate;
112 :
113 : ///Hour before
114 : factory Predicate.hourBefore(PredicatePath path, int hour) =
115 : DateHourBeforePredicate;
116 : }
117 :
118 : ///Enum for define DefaultPredicatePath
119 7 : enum DefaultPath {
120 : ///Document path
121 : document,
122 :
123 : ///Publication date path
124 : firstPublicationDate,
125 :
126 : ///Id Path
127 : id,
128 :
129 : ///Last update path
130 : lastPublicationDate,
131 :
132 : ///Tags path
133 : tags,
134 :
135 : ///Type path
136 : type
137 : }
138 :
139 : ///Base class for Paths
140 : abstract class PredicatePath {}
141 :
142 : ///Define a Default path for predicates
143 : class DefaultPredicatePath extends PredicatePath {
144 5 : DefaultPredicatePath._(this._path);
145 :
146 : ///Default path for document query
147 2 : static final DefaultPredicatePath document =
148 1 : DefaultPredicatePath._(DefaultPath.document);
149 :
150 : ///Default path for id query
151 12 : static final DefaultPredicatePath id = DefaultPredicatePath._(DefaultPath.id);
152 :
153 : ///Default path for tags query
154 2 : static final DefaultPredicatePath tags =
155 1 : DefaultPredicatePath._(DefaultPath.tags);
156 :
157 : ///Default path for type query
158 6 : static final DefaultPredicatePath type =
159 3 : DefaultPredicatePath._(DefaultPath.type);
160 :
161 : ///Default path for publication date query
162 2 : static final DefaultPredicatePath firstPublicationDate =
163 1 : DefaultPredicatePath._(DefaultPath.firstPublicationDate);
164 :
165 : ///Default path for last update query
166 2 : static final DefaultPredicatePath lastPublicationDate =
167 1 : DefaultPredicatePath._(DefaultPath.lastPublicationDate);
168 :
169 : final DefaultPath _path;
170 :
171 5 : @override
172 : String toString() {
173 5 : switch (_path) {
174 5 : case DefaultPath.document:
175 : return 'document';
176 5 : case DefaultPath.id:
177 : return 'document.id';
178 4 : case DefaultPath.tags:
179 : return 'document.tags';
180 4 : case DefaultPath.type:
181 : return 'document.type';
182 1 : case DefaultPath.firstPublicationDate:
183 : return 'document.first_publication_date';
184 1 : case DefaultPath.lastPublicationDate:
185 : return 'document.last_publication_date';
186 : default:
187 : return '';
188 : }
189 : }
190 : }
191 :
192 : ///Define a Custom path for predicates
193 : class CustomPredicatePath extends PredicatePath {
194 : ///Main constructor
195 4 : CustomPredicatePath(this.customType, this.value, {this.fetch = false});
196 :
197 : ///Type
198 : final String customType;
199 :
200 : ///Value
201 : final String value;
202 :
203 : ///For fetch or fetchLinks
204 : final bool fetch;
205 :
206 4 : @override
207 16 : String toString() => fetch ? '$customType.$value' : 'my.$customType.$value';
208 : }
|