Skip to content

Commit 2c976c8

Browse files
committed
Do not rely on Wrap for the trait bounds in the builder API as the compiler cannot figure out the bounds when trying to implement python wrappers.
1 parent 0edc36f commit 2c976c8

File tree

10 files changed

+342
-202
lines changed

10 files changed

+342
-202
lines changed

raphtory/src/db/graph/views/filter/model/edge_filter.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ use crate::{
1515
NodeNameFilterBuilder, NodeTypeFilterBuilder,
1616
},
1717
property_filter::{
18-
InternalPropertyFilterBuilderOps, Op, PropertyFilter, PropertyRef,
18+
InternalPropertyFilterBuilderOps, Op, OpChainBuilder, PropertyFilter,
19+
PropertyRef,
1920
},
2021
AndFilter, EntityMarker, NotFilter, OrFilter, TryAsCompositeFilter, Windowed, Wrap,
2122
},
@@ -204,6 +205,8 @@ impl EndpointWrapper<NodeFilter> {
204205
}
205206

206207
impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps for EndpointWrapper<T> {
208+
type Filter = EndpointWrapper<T::Filter>;
209+
type Chained = EndpointWrapper<T::Chained>;
207210
type Marker = T::Marker;
208211

209212
#[inline]
@@ -220,6 +223,14 @@ impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps for E
220223
fn entity(&self) -> Self::Marker {
221224
self.inner.entity()
222225
}
226+
227+
fn filter(&self, filter: PropertyFilter<Self::Marker>) -> Self::Filter {
228+
self.wrap(self.inner.filter(filter))
229+
}
230+
231+
fn chained(&self, builder: OpChainBuilder<Self::Marker>) -> Self::Chained {
232+
self.wrap(self.inner.chained(builder))
233+
}
223234
}
224235

225236
impl<T: InternalNodeFilterBuilderOps> InternalNodeFilterBuilderOps for EndpointWrapper<T> {

raphtory/src/db/graph/views/filter/model/exploded_edge_filter.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use crate::{
1515
InternalNodeIdFilterBuilderOps, NodeFilter,
1616
},
1717
property_filter::{
18-
InternalPropertyFilterBuilderOps, MetadataFilterBuilder, Op, PropertyFilter,
19-
PropertyFilterBuilder, PropertyRef,
18+
InternalPropertyFilterBuilderOps, MetadataFilterBuilder, Op, OpChainBuilder,
19+
PropertyFilter, PropertyFilterBuilder, PropertyRef,
2020
},
2121
AndFilter, EntityMarker, NotFilter, OrFilter, TryAsCompositeFilter, Windowed, Wrap,
2222
},
@@ -253,6 +253,9 @@ where
253253
impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps
254254
for ExplodedEndpointWrapper<T>
255255
{
256+
type Filter = ExplodedEndpointWrapper<T::Filter>;
257+
type Chained = ExplodedEndpointWrapper<T::Chained>;
258+
256259
type Marker = T::Marker;
257260
#[inline]
258261
fn property_ref(&self) -> PropertyRef {
@@ -268,6 +271,14 @@ impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps
268271
fn entity(&self) -> Self::Marker {
269272
self.inner.entity()
270273
}
274+
275+
fn filter(&self, filter: PropertyFilter<Self::Marker>) -> Self::Filter {
276+
self.wrap(self.inner.filter(filter))
277+
}
278+
279+
fn chained(&self, builder: OpChainBuilder<Self::Marker>) -> Self::Chained {
280+
self.wrap(self.inner.chained(builder))
281+
}
271282
}
272283

273284
#[derive(Clone, Debug, Copy, Default, PartialEq, Eq)]

raphtory/src/db/graph/views/filter/model/mod.rs

Lines changed: 126 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,8 @@ impl<T: InternalNodeIdFilterBuilderOps> InternalNodeIdFilterBuilderOps for Windo
320320
}
321321

322322
impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps for Windowed<T> {
323+
type Filter = Windowed<T::Filter>;
324+
type Chained = Windowed<T::Chained>;
323325
type Marker = T::Marker;
324326

325327
fn property_ref(&self) -> PropertyRef {
@@ -333,6 +335,14 @@ impl<T: InternalPropertyFilterBuilderOps> InternalPropertyFilterBuilderOps for W
333335
fn entity(&self) -> Self::Marker {
334336
self.inner.entity()
335337
}
338+
339+
fn filter(&self, filter: PropertyFilter<Self::Marker>) -> Self::Filter {
340+
self.wrap(self.inner.filter(filter))
341+
}
342+
343+
fn chained(&self, builder: OpChainBuilder<Self::Marker>) -> Self::Chained {
344+
self.wrap(self.inner.chained(builder))
345+
}
336346
}
337347

338348
impl<T: TryAsCompositeFilter> TryAsCompositeFilter for Windowed<T> {
@@ -478,105 +488,197 @@ impl<S: Wrap> Wrap for Arc<S> {
478488
}
479489
}
480490

481-
pub trait InternalPropertyFilterFactory: Wrap {
491+
pub trait InternalPropertyFilterFactory {
482492
type Entity: Clone + Send + Sync + 'static;
493+
type PropertyBuilder: InternalPropertyFilterBuilderOps + TemporalPropertyFilterFactory;
494+
type MetadataBuilder: InternalPropertyFilterBuilderOps;
483495

484496
fn entity(&self) -> Self::Entity;
497+
498+
fn property_builder(
499+
&self,
500+
builder: PropertyFilterBuilder<Self::Entity>,
501+
) -> Self::PropertyBuilder;
502+
503+
fn metadata_builder(
504+
&self,
505+
builder: MetadataFilterBuilder<Self::Entity>,
506+
) -> Self::MetadataBuilder;
485507
}
486508

487509
pub trait PropertyFilterFactory: InternalPropertyFilterFactory {
488-
fn property(
489-
&self,
490-
name: impl Into<String>,
491-
) -> Self::Wrapped<PropertyFilterBuilder<Self::Entity>> {
510+
fn property(&self, name: impl Into<String>) -> Self::PropertyBuilder {
492511
let builder = PropertyFilterBuilder::new(name, self.entity());
493-
self.wrap(builder)
512+
self.property_builder(builder)
494513
}
495514

496-
fn metadata(
497-
&self,
498-
name: impl Into<String>,
499-
) -> Self::Wrapped<MetadataFilterBuilder<Self::Entity>> {
515+
fn metadata(&self, name: impl Into<String>) -> Self::MetadataBuilder {
500516
let builder = MetadataFilterBuilder::new(name, self.entity());
501-
self.wrap(builder)
517+
self.metadata_builder(builder)
502518
}
503519
}
504520

505-
impl<T: PropertyFilterFactory> PropertyFilterFactory for ExplodedEndpointWrapper<T> {}
521+
impl<T: InternalPropertyFilterFactory> PropertyFilterFactory for T {}
506522

507523
pub trait TemporalPropertyFilterFactory: InternalPropertyFilterBuilderOps {
508-
fn temporal(&self) -> Self::Wrapped<OpChainBuilder<Self::Marker>> {
524+
fn temporal(&self) -> Self::Chained {
509525
let builder = OpChainBuilder {
510526
prop_ref: PropertyRef::TemporalProperty(self.property_ref().name().to_string()),
511527
ops: vec![],
512528
entity: self.entity(),
513529
};
514-
self.wrap(builder)
530+
self.chained(builder)
515531
}
516532
}
517533

518534
impl InternalPropertyFilterFactory for NodeFilter {
519535
type Entity = NodeFilter;
536+
type PropertyBuilder = PropertyFilterBuilder<NodeFilter>;
537+
type MetadataBuilder = MetadataFilterBuilder<NodeFilter>;
520538

521539
fn entity(&self) -> Self::Entity {
522540
NodeFilter
523541
}
524-
}
525542

526-
impl PropertyFilterFactory for NodeFilter {}
543+
fn property_builder(
544+
&self,
545+
builder: PropertyFilterBuilder<Self::Entity>,
546+
) -> Self::PropertyBuilder {
547+
builder
548+
}
549+
550+
fn metadata_builder(
551+
&self,
552+
builder: MetadataFilterBuilder<Self::Entity>,
553+
) -> Self::MetadataBuilder {
554+
builder
555+
}
556+
}
527557

528558
impl InternalPropertyFilterFactory for EdgeFilter {
529559
type Entity = EdgeFilter;
560+
type PropertyBuilder = PropertyFilterBuilder<EdgeFilter>;
561+
type MetadataBuilder = MetadataFilterBuilder<EdgeFilter>;
530562

531563
fn entity(&self) -> Self::Entity {
532564
EdgeFilter
533565
}
534-
}
535566

536-
impl PropertyFilterFactory for EdgeFilter {}
567+
fn property_builder(
568+
&self,
569+
builder: PropertyFilterBuilder<Self::Entity>,
570+
) -> Self::PropertyBuilder {
571+
builder
572+
}
573+
574+
fn metadata_builder(
575+
&self,
576+
builder: MetadataFilterBuilder<Self::Entity>,
577+
) -> Self::MetadataBuilder {
578+
builder
579+
}
580+
}
537581

538582
impl InternalPropertyFilterFactory for ExplodedEdgeFilter {
539583
type Entity = ExplodedEdgeFilter;
584+
type PropertyBuilder = PropertyFilterBuilder<ExplodedEdgeFilter>;
585+
type MetadataBuilder = MetadataFilterBuilder<ExplodedEdgeFilter>;
540586

541587
fn entity(&self) -> Self::Entity {
542588
ExplodedEdgeFilter
543589
}
544-
}
545590

546-
impl PropertyFilterFactory for ExplodedEdgeFilter {}
591+
fn property_builder(
592+
&self,
593+
builder: PropertyFilterBuilder<Self::Entity>,
594+
) -> Self::PropertyBuilder {
595+
builder
596+
}
597+
598+
fn metadata_builder(
599+
&self,
600+
builder: MetadataFilterBuilder<Self::Entity>,
601+
) -> Self::MetadataBuilder {
602+
builder
603+
}
604+
}
547605

548606
impl<T: InternalPropertyFilterFactory> InternalPropertyFilterFactory for Windowed<T> {
549607
type Entity = T::Entity;
608+
type PropertyBuilder = Windowed<T::PropertyBuilder>;
609+
type MetadataBuilder = Windowed<T::MetadataBuilder>;
550610

551611
fn entity(&self) -> Self::Entity {
552612
self.inner.entity()
553613
}
614+
615+
fn property_builder(
616+
&self,
617+
builder: PropertyFilterBuilder<Self::Entity>,
618+
) -> Self::PropertyBuilder {
619+
self.wrap(self.inner.property_builder(builder))
620+
}
621+
622+
fn metadata_builder(
623+
&self,
624+
builder: MetadataFilterBuilder<Self::Entity>,
625+
) -> Self::MetadataBuilder {
626+
self.wrap(self.inner.metadata_builder(builder))
627+
}
554628
}
555629

556630
impl<T: TemporalPropertyFilterFactory> TemporalPropertyFilterFactory for Windowed<T> {}
557631

558-
impl<T: PropertyFilterFactory> PropertyFilterFactory for Windowed<T> {}
559-
560632
impl<T: InternalPropertyFilterFactory> InternalPropertyFilterFactory for EndpointWrapper<T> {
561633
type Entity = T::Entity;
634+
type PropertyBuilder = EndpointWrapper<T::PropertyBuilder>;
635+
type MetadataBuilder = EndpointWrapper<T::MetadataBuilder>;
562636

563637
fn entity(&self) -> Self::Entity {
564638
self.inner.entity()
565639
}
640+
641+
fn property_builder(
642+
&self,
643+
builder: PropertyFilterBuilder<Self::Entity>,
644+
) -> Self::PropertyBuilder {
645+
self.wrap(self.inner.property_builder(builder))
646+
}
647+
648+
fn metadata_builder(
649+
&self,
650+
builder: MetadataFilterBuilder<Self::Entity>,
651+
) -> Self::MetadataBuilder {
652+
self.wrap(self.inner.metadata_builder(builder))
653+
}
566654
}
567655

568656
impl<T: TemporalPropertyFilterFactory> TemporalPropertyFilterFactory for EndpointWrapper<T> {}
569657

570-
impl<T: PropertyFilterFactory> PropertyFilterFactory for EndpointWrapper<T> {}
571-
572658
impl<T: InternalPropertyFilterFactory> InternalPropertyFilterFactory
573659
for ExplodedEndpointWrapper<T>
574660
{
575661
type Entity = T::Entity;
662+
type PropertyBuilder = ExplodedEndpointWrapper<T::PropertyBuilder>;
663+
type MetadataBuilder = ExplodedEndpointWrapper<T::MetadataBuilder>;
576664

577665
fn entity(&self) -> Self::Entity {
578666
self.inner.entity()
579667
}
668+
669+
fn property_builder(
670+
&self,
671+
builder: PropertyFilterBuilder<Self::Entity>,
672+
) -> Self::PropertyBuilder {
673+
self.wrap(self.inner.property_builder(builder))
674+
}
675+
676+
fn metadata_builder(
677+
&self,
678+
builder: MetadataFilterBuilder<Self::Entity>,
679+
) -> Self::MetadataBuilder {
680+
self.wrap(self.inner.metadata_builder(builder))
681+
}
580682
}
581683

582684
impl<T: TemporalPropertyFilterFactory> TemporalPropertyFilterFactory

0 commit comments

Comments
 (0)