@prefix sh:   <http://www.w3.org/ns/shacl#> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix obsl: <https://ralforion.com/ns/obsl#> .

obsl:DataObjectShape a sh:NodeShape ;
  sh:targetClass obsl:DataObject ;
  sh:property [ sh:path rdfs:label ; sh:minCount 1 ; sh:datatype xsd:string ] ;
  sh:property [ sh:path obsl:code ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:database ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:schema ; sh:minCount 1 ; sh:maxCount 1 ] .

obsl:ColumnShape a sh:NodeShape ;
  sh:targetClass obsl:Column ;
  sh:property [ sh:path rdfs:label ; sh:minCount 1 ] ;
  sh:property [ sh:path obsl:code ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:resultType ; sh:minCount 1 ; sh:maxCount 1 ] .

obsl:JoinShape a sh:NodeShape ;
  sh:targetClass obsl:Join ;
  sh:property [ sh:path obsl:joinTo ; sh:minCount 1 ; sh:maxCount 1 ; sh:class obsl:DataObject ] ;
  sh:property [ sh:path obsl:cardinality ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:columnFrom ; sh:minCount 1 ; sh:class obsl:Column ] ;
  sh:property [ sh:path obsl:columnTo ; sh:minCount 1 ; sh:class obsl:Column ] .

obsl:DimensionShape a sh:NodeShape ;
  sh:targetClass obsl:Dimension ;
  sh:property [ sh:path obsl:dataObject ; sh:minCount 1 ; sh:maxCount 1 ; sh:class obsl:DataObject ] ;
  sh:property [ sh:path obsl:column ; sh:minCount 1 ; sh:maxCount 1 ; sh:class obsl:Column ] ;
  sh:property [ sh:path obsl:resultType ; sh:minCount 1 ; sh:maxCount 1 ] .

obsl:MeasureShape a sh:NodeShape ;
  sh:targetClass obsl:Measure ;
  sh:property [ sh:path rdfs:label ; sh:minCount 1 ] ;
  sh:property [ sh:path obsl:aggregation ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:resultType ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:xone (
    [ sh:property [ sh:path obsl:sourceColumn ; sh:minCount 1 ] ]
    [ sh:property [ sh:path obsl:expressionSource ; sh:minCount 1 ; sh:maxCount 1 ] ]
  ) .

obsl:MetricShape a sh:NodeShape ;
  sh:targetClass obsl:Metric ;
  sh:property [ sh:path rdfs:label ; sh:minCount 1 ] ;
  sh:property [ sh:path obsl:metricType ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:or (
    [ sh:property [ sh:path obsl:expressionSource ; sh:minCount 1 ] ]
    [ sh:property [ sh:path obsl:baseMeasure ; sh:minCount 1 ] ]
  ) .

obsl:CumulativeMetricShape a sh:NodeShape ;
  sh:targetClass obsl:CumulativeMetric ;
  sh:property [ sh:path obsl:baseMeasure ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:timeDimension ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:cumulativeType ; sh:minCount 1 ; sh:maxCount 1 ] .

obsl:PeriodOverPeriodMetricShape a sh:NodeShape ;
  sh:targetClass obsl:PeriodOverPeriodMetric ;
  sh:property [ sh:path obsl:expressionSource ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:timeDimension ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:timeGrain ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:offset ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:offsetGrain ; sh:minCount 1 ; sh:maxCount 1 ] ;
  sh:property [ sh:path obsl:comparison ; sh:minCount 1 ; sh:maxCount 1 ] .
