#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You under the Apache License, Version 2.0
#  (the "License"); you may not use this file except in compliance with
#  the License.  You may obtain a copy of the License at
# 
#       http://www.apache.org/licenses/LICENSE-2.0
# 
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
@prefix mf:     <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
@prefix mfx:    <http://jena.hpl.hp.com/2005/05/test-manifest-extra#> .
@prefix qt:     <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .

<>  rdf:type mf:Manifest ;
    rdfs:label "Modifiers" ;
    mf:entries
    ( 
       [  mf:name   "Slice 1" ;
          mf:action [ qt:query <slice-1.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Slice 2" ;
          mf:action [ qt:query <slice-2.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Slice 3" ;
          mf:action [ qt:query <slice-3.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Slice 4" ;
          mf:action [ qt:query <slice-4.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Slice 5" ;
          mf:action [ qt:query <slice-5.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Slice 6" ;
          mf:action [ qt:query <slice-6.rq> ; qt:data <data-1.ttl> ] ;
       ]
## Order of results is not fixed so not stable.
##        [  mf:name   "Slice 7" ;
##           mf:action [ qt:query <slice-7.rq> ; qt:data <data-1.ttl> ] ;
##        ]
##        [  mf:name   "Slice 8" ;
##           mf:action [ qt:query <slice-8.rq> ; qt:data <data-1.ttl> ] ;
##        ]
##        [  mf:name   "Slice 9" ;
##           mf:action [ qt:query <slice-9.rq> ; qt:data <data-1.ttl> ] ;
##        ]
       [  mf:name   "Distinct 1" ;
          mf:action [ qt:query <distinct-1.rq> ; qt:data <data-1.ttl> ] ;
       ]
       [  mf:name   "Distinct 2" ;
          mf:action [ qt:query <distinct-2.rq> ; qt:data <data-1.ttl> ] ;
       ]
    ).
