@@ -152,28 +152,72 @@ public PagedItems<InstructionLogModel> GetInstructionLogs(InstructLogFilter filt
152152 filter = InstructLogFilter . Empty ( ) ;
153153 }
154154
155- var builder = Builders < InstructionLogDocument > . Filter ;
156- var filters = new List < FilterDefinition < InstructionLogDocument > > ( ) { builder . Empty } ;
155+ var logBuilder = Builders < InstructionLogDocument > . Filter ;
156+ var logFilters = new List < FilterDefinition < InstructionLogDocument > > ( ) { logBuilder . Empty } ;
157157
158158 // Filter logs
159159 if ( ! filter . AgentIds . IsNullOrEmpty ( ) )
160160 {
161- filters . Add ( builder . In ( x => x . AgentId , filter . AgentIds ) ) ;
161+ logFilters . Add ( logBuilder . In ( x => x . AgentId , filter . AgentIds ) ) ;
162162 }
163163 if ( ! filter . Providers . IsNullOrEmpty ( ) )
164164 {
165- filters . Add ( builder . In ( x => x . Provider , filter . Providers ) ) ;
165+ logFilters . Add ( logBuilder . In ( x => x . Provider , filter . Providers ) ) ;
166166 }
167167 if ( ! filter . Models . IsNullOrEmpty ( ) )
168168 {
169- filters . Add ( builder . In ( x => x . Model , filter . Models ) ) ;
169+ logFilters . Add ( logBuilder . In ( x => x . Model , filter . Models ) ) ;
170170 }
171171 if ( ! filter . TemplateNames . IsNullOrEmpty ( ) )
172172 {
173- filters . Add ( builder . In ( x => x . TemplateName , filter . TemplateNames ) ) ;
173+ logFilters . Add ( logBuilder . In ( x => x . TemplateName , filter . TemplateNames ) ) ;
174174 }
175175
176- var filterDef = builder . And ( filters ) ;
176+ // Filter states
177+ if ( filter != null && ! filter . States . IsNullOrEmpty ( ) )
178+ {
179+ foreach ( var pair in filter . States )
180+ {
181+ if ( string . IsNullOrWhiteSpace ( pair . Key ) ) continue ;
182+
183+ // Format key
184+ var keys = pair . Key . Split ( "." ) . ToList ( ) ;
185+ keys . Insert ( 1 , "data" ) ;
186+ keys . Insert ( 0 , "States" ) ;
187+ var formattedKey = string . Join ( "." , keys ) ;
188+
189+ if ( string . IsNullOrWhiteSpace ( pair . Value ) )
190+ {
191+ logFilters . Add ( logBuilder . Exists ( formattedKey ) ) ;
192+ }
193+ else if ( bool . TryParse ( pair . Value , out var boolValue ) )
194+ {
195+ logFilters . Add ( logBuilder . Eq ( formattedKey , boolValue ) ) ;
196+ }
197+ else if ( int . TryParse ( pair . Value , out var intValue ) )
198+ {
199+ logFilters . Add ( logBuilder . Eq ( formattedKey , intValue ) ) ;
200+ }
201+ else if ( decimal . TryParse ( pair . Value , out var decimalValue ) )
202+ {
203+ logFilters . Add ( logBuilder . Eq ( formattedKey , decimalValue ) ) ;
204+ }
205+ else if ( float . TryParse ( pair . Value , out var floatValue ) )
206+ {
207+ logFilters . Add ( logBuilder . Eq ( formattedKey , floatValue ) ) ;
208+ }
209+ else if ( double . TryParse ( pair . Value , out var doubleValue ) )
210+ {
211+ logFilters . Add ( logBuilder . Eq ( formattedKey , doubleValue ) ) ;
212+ }
213+ else
214+ {
215+ logFilters . Add ( logBuilder . Eq ( formattedKey , pair . Value ) ) ;
216+ }
217+ }
218+ }
219+
220+ var filterDef = logBuilder . And ( logFilters ) ;
177221 var sortDef = Builders < InstructionLogDocument > . Sort . Descending ( x => x . CreatedTime ) ;
178222 var docs = _dc . InstructionLogs . Find ( filterDef ) . Sort ( sortDef ) . Skip ( filter . Offset ) . Limit ( filter . Size ) . ToList ( ) ;
179223 var count = _dc . InstructionLogs . CountDocuments ( filterDef ) ;
0 commit comments