@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix ex: <https://example.com/advertising-measurement/query/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rng: <https://ontology.inferal.com/modules/range/> .
@prefix time: <http://www.w3.org/2006/time#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:t1 a time:Instant ; time:inXSDDateTimeStamp "2026-06-01T00:00:00Z"^^xsd:dateTimeStamp .
ex:t2 a time:Instant ; time:inXSDDateTimeStamp "2026-06-16T00:00:00Z"^^xsd:dateTimeStamp .
ex:t3 a time:Instant ; time:inXSDDateTimeStamp "2026-07-01T00:00:00Z"^^xsd:dateTimeStamp .

ex:june a adm:ReportingWindow ; rdfs:label "June 2026" ;
    adm:windowStart ex:t1 ; adm:windowEnd ex:t3 ;
    rng:lowerInclusive true ; rng:upperInclusive false .

ex:lookback7d a rng:Range ; rdfs:label "seven day lookback" .

ex:lastClick a adm:AttributionBasis ; rdfs:label "last click, 7 day" ;
    adm:usedAttributionModel adm:lastClickModel ; adm:lookbackWindow ex:lookback7d .

# ex:ad1 moves from group A to group B partway through the window, while ex:ad2
# never moves. Bound before the transition, the query returns both ads under
# group A. Bound after it, ex:ad2 stays under A and ex:ad1 appears under B.

ex:ad1InA a adm:HierarchyMembership ;
    adm:containedResource ex:ad1 ; adm:containedIn ex:groupA ;
    adm:validityWindow ex:firstHalf .
ex:firstHalf a rng:Range ; rng:lowerBound ex:t1 ; rng:upperBound ex:t2 ;
    rng:lowerInclusive true ; rng:upperInclusive false .

ex:ad1InB a adm:HierarchyMembership ;
    adm:containedResource ex:ad1 ; adm:containedIn ex:groupB ;
    adm:validityWindow ex:secondHalf .
ex:secondHalf a rng:Range ; rng:lowerBound ex:t2 ; rng:lowerInclusive true .

ex:ad2InA a adm:HierarchyMembership ;
    adm:containedResource ex:ad2 ; adm:containedIn ex:groupA ;
    adm:validityWindow ex:whole .
ex:whole a rng:Range ; rng:lowerBound ex:t1 ; rng:lowerInclusive true .
