#  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 "SDB - Scripts - Simple layout" ;
    mfx:include (
        <General/manifest.ttl>
        # Some databases do allow the full range of 
        # unicode in SQL statements as strings (need prepared statements)
        #<Unicode/manifest.ttl>
        <BasicPatterns/manifest.ttl>

        <Optionals1/manifest.ttl>
        <Integration/manifest.ttl>
        <Expressions/manifest.ttl>

        <Algebra/manifest.ttl>
        <Structure/manifest.ttl>
        # No quad support
        #<Graph/manifest.ttl>
    ) .
