@@ -51,6 +51,8 @@ class Field(StrEnum):
5151 namespace = "namespace"
5252 direct_member = "direct_member"
5353 inherited_member = "inherited_member"
54+ doi = "doi"
55+ publisher_name = "publisher_name"
5456
5557
5658class Comparison (StrEnum ):
@@ -631,6 +633,54 @@ async def accept(self, visitor: SegmentVisitior) -> None:
631633 return await visitor .visit_role_is (self )
632634
633635
636+ @dataclass
637+ class DoiIs (FieldComparison ):
638+ """Compare the doi against a list of values."""
639+
640+ values : Nel [str ]
641+
642+ @property
643+ def field (self ) -> Field :
644+ """The field name."""
645+ return Field .doi
646+
647+ @property
648+ def cmp (self ) -> Comparison :
649+ """The comparison operation."""
650+ return Comparison .is_equal
651+
652+ def _render_value (self ) -> str :
653+ return self .values .mk_string ("," , Helper .quote )
654+
655+ async def accept (self , visitor : SegmentVisitior ) -> None :
656+ """Apply this to the visitor."""
657+ return await visitor .visit_doi_is (self )
658+
659+
660+ @dataclass
661+ class PublisherNameIs (FieldComparison ):
662+ """Compare the publisher name against a list of values."""
663+
664+ values : Nel [str ]
665+
666+ @property
667+ def field (self ) -> Field :
668+ """The field name."""
669+ return Field .publisher_name
670+
671+ @property
672+ def cmp (self ) -> Comparison :
673+ """The comparison operation."""
674+ return Comparison .is_equal
675+
676+ def _render_value (self ) -> str :
677+ return self .values .mk_string ("," , Helper .quote )
678+
679+ async def accept (self , visitor : SegmentVisitior ) -> None :
680+ """Apply this to the visitor."""
681+ return await visitor .visit_publisher_name_is (self )
682+
683+
634684@dataclass
635685class Text (SegmentBase ):
636686 """A query part that is not corresponding to a specific field."""
@@ -712,6 +762,8 @@ async def accept(self, visitor: SegmentVisitior) -> None:
712762 | RoleIs
713763 | InheritedMemberIs
714764 | DirectMemberIs
765+ | DoiIs
766+ | PublisherNameIs
715767)
716768
717769
@@ -812,6 +864,16 @@ def role_is(cls, role: Role, *args: Role) -> Segment:
812864 """Return role-is query segment."""
813865 return RoleIs (Nel (role , list (args )))
814866
867+ @classmethod
868+ def doi_is (cls , doi : str , * args : str ) -> Segment :
869+ """Return slug-is query segment."""
870+ return DoiIs (Nel (doi , list (args )))
871+
872+ @classmethod
873+ def publisher_name_is (cls , publisher_name : str , * args : str ) -> Segment :
874+ """Return slug-is query segment."""
875+ return PublisherNameIs (Nel (publisher_name , list (args )))
876+
815877
816878@dataclass
817879class UserQuery :
@@ -920,6 +982,16 @@ async def visit_inherited_member_is(self, ft: InheritedMemberIs) -> None:
920982 """Visit inherited-member-is."""
921983 ...
922984
985+ @abstractmethod
986+ async def visit_doi_is (self , ft : DoiIs ) -> None :
987+ """Visit doi-is."""
988+ ...
989+
990+ @abstractmethod
991+ async def visit_publisher_name_is (self , ft : PublisherNameIs ) -> None :
992+ """Visit doi-is."""
993+ ...
994+
923995
924996class UserQueryVisitor [T ](SegmentVisitior ):
925997 """A visitor to transform user queries."""
@@ -1001,6 +1073,16 @@ async def visit_visibility_is(self, ft: VisibilityIs) -> None:
10011073 """Forwards to `visit_field_term`."""
10021074 return await self .visit_field_term (ft )
10031075
1076+ @override
1077+ async def visit_doi_is (self , ft : DoiIs ) -> None :
1078+ """Forwards to `visit_field_term`."""
1079+ return await self .visit_field_term (ft )
1080+
1081+ @override
1082+ async def visit_publisher_name_is (self , ft : PublisherNameIs ) -> None :
1083+ """Forwards to `visit_field_term`."""
1084+ return await self .visit_field_term (ft )
1085+
10041086
10051087class EmptyUserQueryVisitor [T ](UserQueryFieldTermVisitor [T ]):
10061088 """A visitor with every method doing nothing.
0 commit comments