@@ -463,7 +463,7 @@ def _where_equals(
463463 tokens = self .__get_current_where_tokens ()
464464 self .__append_operator_if_needed (tokens )
465465
466- if self .__if_value_is_method (WhereOperator .EQUALS , params , tokens ):
466+ if self ._if_value_is_method (WhereOperator .EQUALS , params , tokens ):
467467 return
468468
469469 transform_to_equal_value = self .__transform_value (params )
@@ -476,17 +476,21 @@ def _where_equals(
476476 )
477477 tokens .append (where_token )
478478
479- def __if_value_is_method (self , op : WhereOperator , where_params : WhereParams , tokens : List [QueryToken ]) -> bool :
479+ def _if_value_is_method (self , op : WhereOperator , where_params : WhereParams , tokens : List [QueryToken ]) -> bool :
480+ # MethodCall values (RavenDocumentQuery.now/today, CmpXchg) emit a
481+ # method-flavored WhereToken instead of binding as a parameter.
482+ # Returns True if a token was appended (caller should short-circuit).
480483 if isinstance (where_params .value , MethodCall ):
484+ from ravendb .documents .queries .raven_document_query import RavenDocumentQuery
485+
481486 mc = where_params .value
482487
483488 args = []
484489 for arg in mc .args :
485490 args .append (self .__add_query_parameter (arg ))
486491
487492 token : Optional [WhereToken ] = None
488- object_type = type (mc )
489- if object_type == CmpXchg :
493+ if isinstance (mc , CmpXchg ):
490494 token = WhereToken .create (
491495 op ,
492496 where_params .field_name ,
@@ -500,8 +504,22 @@ def __if_value_is_method(self, op: WhereOperator, where_params: WhereParams, tok
500504 )
501505 ),
502506 )
507+ elif isinstance (mc , RavenDocumentQuery .Time ):
508+ token = WhereToken .create (
509+ op ,
510+ where_params .field_name ,
511+ None ,
512+ WhereToken .WhereOptions (
513+ method_type__parameters__property__exact = (
514+ mc .method_type ,
515+ args ,
516+ mc .access_path ,
517+ where_params .exact ,
518+ )
519+ ),
520+ )
503521 else :
504- raise TypeError (f"Unknown method { object_type } " )
522+ raise TypeError (f"Unknown method { type ( mc ) } " )
505523
506524 tokens .append (token )
507525 return True
@@ -537,7 +555,7 @@ def _where_not_equals(
537555
538556 where_params .field_name = self ._ensure_valid_field_name (where_params .field_name , where_params .nested_path )
539557
540- if self .__if_value_is_method (WhereOperator .NOT_EQUALS , where_params , tokens ):
558+ if self ._if_value_is_method (WhereOperator .NOT_EQUALS , where_params , tokens ):
541559 return
542560
543561 where_token = WhereToken .create (
@@ -639,82 +657,46 @@ def _where_between(self, field_name: str, start: object, end: object, exact: Opt
639657 )
640658 tokens .append (where_token )
641659
642- def _where_greater_than (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
660+ def _where_compare (
661+ self ,
662+ op : WhereOperator ,
663+ field_name : str ,
664+ value : object ,
665+ exact : Optional [bool ],
666+ null_sentinel : str ,
667+ ) -> None :
668+ # Shared body for >/>=/</<=. Routes through _if_value_is_method first
669+ # so MethodCall values (now/today/cmpxchg) are emitted as RQL calls.
643670 field_name = self ._ensure_valid_field_name (field_name , False )
644-
645671 tokens = self .__get_current_where_tokens ()
646672 self .__append_operator_if_needed (tokens )
647673 self .__negate_if_needed (tokens , field_name )
648674 where_params = WhereParams ()
649675 where_params .value = value
650676 where_params .field_name = field_name
677+ where_params .exact = exact
651678
652- parameter = self .__add_query_parameter ("*" if value is None else self .__transform_value (where_params , True ))
653- where_token = WhereToken .create (
654- WhereOperator .GREATER_THAN ,
655- field_name ,
656- parameter ,
657- WhereToken .WhereOptions (exact__from__to = (exact , None , None )),
658- )
659- tokens .append (where_token )
660-
661- def _where_greater_than_or_equal (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
662- field_name = self ._ensure_valid_field_name (field_name , False )
663-
664- tokens = self .__get_current_where_tokens ()
665- self .__append_operator_if_needed (tokens )
666- self .__negate_if_needed (tokens , field_name )
667- where_params = WhereParams ()
668- where_params .value = value
669- where_params .field_name = field_name
679+ if self ._if_value_is_method (op , where_params , tokens ):
680+ return
670681
671- parameter = self .__add_query_parameter ("*" if value is None else self .__transform_value (where_params , True ))
672- where_token = WhereToken .create (
673- WhereOperator .GREATER_THAN_OR_EQUAL ,
674- field_name ,
675- parameter ,
676- WhereToken .WhereOptions (exact__from__to = (exact , None , None )),
682+ parameter = self .__add_query_parameter (
683+ null_sentinel if value is None else self .__transform_value (where_params , True )
677684 )
678- tokens .append (where_token )
679-
680- def _where_less_than (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
681- field_name = self ._ensure_valid_field_name (field_name , False )
682-
683- tokens = self .__get_current_where_tokens ()
684- self .__append_operator_if_needed (tokens )
685- self .__negate_if_needed (tokens , field_name )
686- where_params = WhereParams ()
687- where_params .value = value
688- where_params .field_name = field_name
689-
690- parameter = self .__add_query_parameter ("*" if value is None else self .__transform_value (where_params , True ))
691- where_token = WhereToken .create (
692- WhereOperator .LESS_THAN ,
693- field_name ,
694- parameter ,
695- WhereToken .WhereOptions (exact__from__to = (exact , None , None )),
685+ tokens .append (
686+ WhereToken .create (op , field_name , parameter , WhereToken .WhereOptions (exact__from__to = (exact , None , None )))
696687 )
697- tokens .append (where_token )
698688
699- def _where_less_than_or_equal (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
700- field_name = self ._ensure_valid_field_name ( field_name , False )
689+ def _where_greater_than (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
690+ self ._where_compare ( WhereOperator . GREATER_THAN , field_name , value , exact , "*" )
701691
702- tokens = self .__get_current_where_tokens ()
703- self .__append_operator_if_needed (tokens )
704- self .__negate_if_needed (tokens , field_name )
692+ def _where_greater_than_or_equal (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
693+ self ._where_compare (WhereOperator .GREATER_THAN_OR_EQUAL , field_name , value , exact , "*" )
705694
706- where_params = WhereParams ()
707- where_params .value = value
708- where_params .field_name = field_name
695+ def _where_less_than (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
696+ self ._where_compare (WhereOperator .LESS_THAN , field_name , value , exact , "NULL" )
709697
710- parameter = self .__add_query_parameter ("NULL" if value is None else self .__transform_value (where_params , True ))
711- where_token = WhereToken .create (
712- WhereOperator .LESS_THAN_OR_EQUAL ,
713- field_name ,
714- parameter ,
715- WhereToken .WhereOptions (exact__from__to = (exact , None , None )),
716- )
717- tokens .append (where_token )
698+ def _where_less_than_or_equal (self , field_name : str , value : object , exact : Optional [bool ] = False ) -> None :
699+ self ._where_compare (WhereOperator .LESS_THAN_OR_EQUAL , field_name , value , exact , "NULL" )
718700
719701 def _where_regex (self , field_name : str , pattern : str ) -> None :
720702 field_name = self ._ensure_valid_field_name (field_name , False )
0 commit comments