@@ -26,10 +26,16 @@ public class IntervalsQuery : FieldNameQueryBase, IIntervalsQuery
2626 /// <inheritdoc cref="IIntervalsMatch"/>
2727 public IIntervalsMatch Match { get ; set ; }
2828
29+ /// <inheritdoc cref="IIntervalsPrefix"/>
30+ public IIntervalsPrefix Prefix { get ; set ; }
31+
32+ /// <inheritdoc cref="IIntervalsWildcard"/>
33+ public IIntervalsWildcard Wildcard { get ; set ; }
34+
2935 protected override bool Conditionless => IsConditionless ( this ) ;
3036
3137 internal static bool IsConditionless ( IIntervalsQuery q ) =>
32- q . Field . IsConditionless ( ) || q . Match == null && q . AllOf == null && q . AnyOf == null ;
38+ q . Field . IsConditionless ( ) || q . Match == null && q . AllOf == null && q . AnyOf == null && q . Prefix == null && q . Wildcard == null ;
3339
3440 internal override void InternalWrapInContainer ( IQueryContainer container ) => container . Intervals = this ;
3541 }
@@ -45,11 +51,21 @@ public class IntervalsQueryDescriptor<T>
4551 IIntervalsAllOf IIntervalsContainer . AllOf { get ; set ; }
4652 IIntervalsAnyOf IIntervalsContainer . AnyOf { get ; set ; }
4753 IIntervalsMatch IIntervalsContainer . Match { get ; set ; }
54+ IIntervalsPrefix IIntervalsContainer . Prefix { get ; set ; }
55+ IIntervalsWildcard IIntervalsContainer . Wildcard { get ; set ; }
4856
4957 /// <inheritdoc cref="IntervalsQuery.Match" />
5058 public IntervalsQueryDescriptor < T > Match ( Func < IntervalsMatchDescriptor , IIntervalsMatch > selector ) =>
5159 Assign ( selector , ( a , v ) => a . Match = v ? . Invoke ( new IntervalsMatchDescriptor ( ) ) ) ;
5260
61+ /// <inheritdoc cref="IntervalsQuery.Prefix" />
62+ public IntervalsQueryDescriptor < T > Prefix ( Func < IntervalsPrefixDescriptor , IIntervalsPrefix > selector ) =>
63+ Assign ( selector , ( a , v ) => a . Prefix = v ? . Invoke ( new IntervalsPrefixDescriptor ( ) ) ) ;
64+
65+ /// <inheritdoc cref="IntervalsQuery.Wildcard" />
66+ public IntervalsQueryDescriptor < T > Wildcard ( Func < IntervalsWildcardDescriptor , IIntervalsWildcard > selector ) =>
67+ Assign ( selector , ( a , v ) => a . Wildcard = v ? . Invoke ( new IntervalsWildcardDescriptor ( ) ) ) ;
68+
5369 /// <inheritdoc cref="IntervalsQuery.AnyOf" />
5470 public IntervalsQueryDescriptor < T > AnyOf ( Func < IntervalsAnyOfDescriptor , IIntervalsAnyOf > selector ) =>
5571 Assign ( selector , ( a , v ) => a . AnyOf = v ? . Invoke ( new IntervalsAnyOfDescriptor ( ) ) ) ;
@@ -75,6 +91,14 @@ public interface IIntervalsContainer
7591 /// <inheritdoc cref="IIntervalsMatch" />
7692 [ DataMember ( Name = "match" ) ]
7793 IIntervalsMatch Match { get ; set ; }
94+
95+ /// <inheritdoc cref="IIntervalsPrefix" />
96+ [ DataMember ( Name = "prefix" ) ]
97+ IIntervalsPrefix Prefix { get ; set ; }
98+
99+ /// <inheritdoc cref="IIntervalsWildcard" />
100+ [ DataMember ( Name = "wildcard" ) ]
101+ IIntervalsWildcard Wildcard { get ; set ; }
78102 }
79103
80104 /// <inheritdoc cref="IIntervalsContainer" />
@@ -88,13 +112,25 @@ public IntervalsContainer(IntervalsBase intervals)
88112 intervals . WrapInContainer ( this ) ;
89113 }
90114
115+ public IntervalsContainer ( IntervalsNoFilterBase intervals )
116+ {
117+ intervals . ThrowIfNull ( nameof ( intervals ) ) ;
118+ intervals . WrapInContainer ( this ) ;
119+ }
120+
91121 IIntervalsAllOf IIntervalsContainer . AllOf { get ; set ; }
92122 IIntervalsAnyOf IIntervalsContainer . AnyOf { get ; set ; }
93123 IIntervalsMatch IIntervalsContainer . Match { get ; set ; }
124+ IIntervalsPrefix IIntervalsContainer . Prefix { get ; set ; }
125+ IIntervalsWildcard IIntervalsContainer . Wildcard { get ; set ; }
94126
95127 public static implicit operator IntervalsContainer ( IntervalsBase intervals ) => intervals == null
96128 ? null
97129 : new IntervalsContainer ( intervals ) ;
130+
131+ public static implicit operator IntervalsContainer ( IntervalsNoFilterBase intervals ) => intervals == null
132+ ? null
133+ : new IntervalsContainer ( intervals ) ;
98134 }
99135
100136 /// <summary>
@@ -109,6 +145,14 @@ private IntervalsDescriptor Assign<TValue>(TValue value, Action<IIntervalsContai
109145 public IntervalsDescriptor Match ( Func < IntervalsMatchDescriptor , IIntervalsMatch > selector ) =>
110146 Assign ( selector , ( a , v ) => a . Match = v ? . Invoke ( new IntervalsMatchDescriptor ( ) ) ) ;
111147
148+ /// <inheritdoc cref="IntervalsPrefixDescriptor" />
149+ public IntervalsDescriptor Prefix ( Func < IntervalsPrefixDescriptor , IIntervalsPrefix > selector ) =>
150+ Assign ( selector , ( a , v ) => a . Prefix = v ? . Invoke ( new IntervalsPrefixDescriptor ( ) ) ) ;
151+
152+ /// <inheritdoc cref="IntervalsWildcardDescriptor" />
153+ public IntervalsDescriptor Wildcard ( Func < IntervalsWildcardDescriptor , IIntervalsWildcard > selector ) =>
154+ Assign ( selector , ( a , v ) => a . Wildcard = v ? . Invoke ( new IntervalsWildcardDescriptor ( ) ) ) ;
155+
112156 /// <inheritdoc cref="IntervalsAnyOfDescriptor" />
113157 public IntervalsDescriptor AnyOf ( Func < IntervalsAnyOfDescriptor , IIntervalsAnyOf > selector ) =>
114158 Assign ( selector , ( a , v ) => a . AnyOf = v ? . Invoke ( new IntervalsAnyOfDescriptor ( ) ) ) ;
@@ -118,8 +162,9 @@ public IntervalsDescriptor AllOf(Func<IntervalsAllOfDescriptor, IIntervalsAllOf>
118162 Assign ( selector , ( a , v ) => a . AllOf = v ? . Invoke ( new IntervalsAllOfDescriptor ( ) ) ) ;
119163 }
120164
165+ // TODO: Rename this to IIntervalsWithFilter and IIntervalsNoFilter to IIntervals in 8.0
121166 /// <summary>
122- /// An <see cref="IIntervalsQuery" /> rule
167+ /// An <see cref="IIntervalsQuery" /> rule with an optional filter
123168 /// </summary>
124169 public interface IIntervals
125170 {
@@ -130,6 +175,13 @@ public interface IIntervals
130175 IIntervalsFilter Filter { get ; set ; }
131176 }
132177
178+ /// <summary>
179+ /// An <see cref="IIntervalsQuery" /> rule
180+ /// </summary>
181+ public interface IIntervalsNoFilter
182+ {
183+ }
184+
133185 /// <summary>
134186 /// Base type for an <see cref="IIntervals" /> implementation
135187 /// </summary>
@@ -141,6 +193,14 @@ public abstract class IntervalsBase : IIntervals
141193 internal abstract void WrapInContainer ( IIntervalsContainer container ) ;
142194 }
143195
196+ /// <summary>
197+ /// Base type for an <see cref="IIntervalsNoFilter" /> implementation
198+ /// </summary>
199+ public abstract class IntervalsNoFilterBase : IIntervalsNoFilter
200+ {
201+ internal abstract void WrapInContainer ( IIntervalsContainer container ) ;
202+ }
203+
144204 /// <summary>
145205 /// Base type for descriptors that define <see cref="IIntervals" />
146206 /// </summary>
@@ -166,6 +226,14 @@ public IntervalsListDescriptor() : base(new List<IntervalsContainer>()) { }
166226 public IntervalsListDescriptor Match ( Func < IntervalsMatchDescriptor , IIntervalsMatch > selector ) =>
167227 Assign ( selector , ( a , v ) => a . AddIfNotNull ( new IntervalsDescriptor ( ) . Match ( v ) ) ) ;
168228
229+ /// <inheritdoc cref="IIntervalsPrefix" />
230+ public IntervalsListDescriptor Prefix ( Func < IntervalsPrefixDescriptor , IIntervalsPrefix > selector ) =>
231+ Assign ( selector , ( a , v ) => a . AddIfNotNull ( new IntervalsDescriptor ( ) . Prefix ( v ) ) ) ;
232+
233+ /// <inheritdoc cref="IIntervalsWildcard" />
234+ public IntervalsListDescriptor Wildcard ( Func < IntervalsWildcardDescriptor , IIntervalsWildcard > selector ) =>
235+ Assign ( selector , ( a , v ) => a . AddIfNotNull ( new IntervalsDescriptor ( ) . Wildcard ( v ) ) ) ;
236+
169237 /// <inheritdoc cref="IIntervalsAnyOf" />
170238 public IntervalsListDescriptor AnyOf ( Func < IntervalsAnyOfDescriptor , IIntervalsAnyOf > selector ) =>
171239 Assign ( selector , ( a , v ) => a . AddIfNotNull ( new IntervalsDescriptor ( ) . AnyOf ( v ) ) ) ;
0 commit comments