1616
1717from  stac_fastapi .core .base_database_logic  import  BaseDatabaseLogic 
1818from  stac_fastapi .core .serializers  import  CollectionSerializer , ItemSerializer 
19- from  stac_fastapi .core .utilities  import  bbox2polygon , get_max_limit 
19+ from  stac_fastapi .core .utilities  import  bbox2polygon , get_bool_env ,  get_max_limit 
2020from  stac_fastapi .extensions .core .transaction .request  import  (
2121    PartialCollection ,
2222    PartialItem ,
@@ -301,21 +301,94 @@ def apply_datetime_filter(
301301        if  not  datetime_search :
302302            return  search , datetime_search 
303303
304-         if  "eq"  in  datetime_search :
305-             # For exact matches, include: 
306-             # 1. Items with matching exact datetime 
307-             # 2. Items with datetime:null where the time falls within their range 
308-             should  =  [
309-                 Q (
310-                     "bool" ,
311-                     filter = [
312-                         Q ("exists" , field = "properties.datetime" ),
313-                         Q ("term" , ** {"properties__datetime" : datetime_search ["eq" ]}),
314-                     ],
315-                 ),
316-                 Q (
304+         # USE_DATETIME env var 
305+         # True: Search by datetime, if null search by start/end datetime 
306+         # False: Always search only by start/end datetime 
307+         USE_DATETIME  =  get_bool_env ("USE_DATETIME" , default = True )
308+ 
309+         if  USE_DATETIME :
310+             if  "eq"  in  datetime_search :
311+                 # For exact matches, include: 
312+                 # 1. Items with matching exact datetime 
313+                 # 2. Items with datetime:null where the time falls within their range 
314+                 should  =  [
315+                     Q (
316+                         "bool" ,
317+                         filter = [
318+                             Q ("exists" , field = "properties.datetime" ),
319+                             Q (
320+                                 "term" ,
321+                                 ** {"properties__datetime" : datetime_search ["eq" ]},
322+                             ),
323+                         ],
324+                     ),
325+                     Q (
326+                         "bool" ,
327+                         must_not = [Q ("exists" , field = "properties.datetime" )],
328+                         filter = [
329+                             Q ("exists" , field = "properties.start_datetime" ),
330+                             Q ("exists" , field = "properties.end_datetime" ),
331+                             Q (
332+                                 "range" ,
333+                                 properties__start_datetime = {
334+                                     "lte" : datetime_search ["eq" ]
335+                                 },
336+                             ),
337+                             Q (
338+                                 "range" ,
339+                                 properties__end_datetime = {"gte" : datetime_search ["eq" ]},
340+                             ),
341+                         ],
342+                     ),
343+                 ]
344+             else :
345+                 # For date ranges, include: 
346+                 # 1. Items with datetime in the range 
347+                 # 2. Items with datetime:null that overlap the search range 
348+                 should  =  [
349+                     Q (
350+                         "bool" ,
351+                         filter = [
352+                             Q ("exists" , field = "properties.datetime" ),
353+                             Q (
354+                                 "range" ,
355+                                 properties__datetime = {
356+                                     "gte" : datetime_search ["gte" ],
357+                                     "lte" : datetime_search ["lte" ],
358+                                 },
359+                             ),
360+                         ],
361+                     ),
362+                     Q (
363+                         "bool" ,
364+                         must_not = [Q ("exists" , field = "properties.datetime" )],
365+                         filter = [
366+                             Q ("exists" , field = "properties.start_datetime" ),
367+                             Q ("exists" , field = "properties.end_datetime" ),
368+                             Q (
369+                                 "range" ,
370+                                 properties__start_datetime = {
371+                                     "lte" : datetime_search ["lte" ]
372+                                 },
373+                             ),
374+                             Q (
375+                                 "range" ,
376+                                 properties__end_datetime = {
377+                                     "gte" : datetime_search ["gte" ]
378+                                 },
379+                             ),
380+                         ],
381+                     ),
382+                 ]
383+ 
384+             return  (
385+                 search .query (Q ("bool" , should = should , minimum_should_match = 1 )),
386+                 datetime_search ,
387+             )
388+         else :
389+             if  "eq"  in  datetime_search :
390+                 filter_query  =  Q (
317391                    "bool" ,
318-                     must_not = [Q ("exists" , field = "properties.datetime" )],
319392                    filter = [
320393                        Q ("exists" , field = "properties.start_datetime" ),
321394                        Q ("exists" , field = "properties.end_datetime" ),
@@ -328,29 +401,10 @@ def apply_datetime_filter(
328401                            properties__end_datetime = {"gte" : datetime_search ["eq" ]},
329402                        ),
330403                    ],
331-                 ),
332-             ]
333-         else :
334-             # For date ranges, include: 
335-             # 1. Items with datetime in the range 
336-             # 2. Items with datetime:null that overlap the search range 
337-             should  =  [
338-                 Q (
339-                     "bool" ,
340-                     filter = [
341-                         Q ("exists" , field = "properties.datetime" ),
342-                         Q (
343-                             "range" ,
344-                             properties__datetime = {
345-                                 "gte" : datetime_search ["gte" ],
346-                                 "lte" : datetime_search ["lte" ],
347-                             },
348-                         ),
349-                     ],
350-                 ),
351-                 Q (
404+                 )
405+             else :
406+                 filter_query  =  Q (
352407                    "bool" ,
353-                     must_not = [Q ("exists" , field = "properties.datetime" )],
354408                    filter = [
355409                        Q ("exists" , field = "properties.start_datetime" ),
356410                        Q ("exists" , field = "properties.end_datetime" ),
@@ -363,13 +417,8 @@ def apply_datetime_filter(
363417                            properties__end_datetime = {"gte" : datetime_search ["gte" ]},
364418                        ),
365419                    ],
366-                 ),
367-             ]
368- 
369-         return  (
370-             search .query (Q ("bool" , should = should , minimum_should_match = 1 )),
371-             datetime_search ,
372-         )
420+                 )
421+             return  search .query (filter_query ), datetime_search 
373422
374423    @staticmethod  
375424    def  apply_bbox_filter (search : Search , bbox : List ):
0 commit comments