package org.exist.xmldb; import junit.framework.TestCase; import org.exist.collections.CollectionConfiguration; import org.exist.storage.DBBroker; import org.exist.test.TestConstants; import org.exist.xquery.Constants; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; public class CollectionConfigurationTest extends TestCase { private final static String URI = "xmldb:exist://"; private final static String DRIVER = "org.exist.xmldb.DatabaseImpl"; private final static XmldbURI TEST_COLLECTION = XmldbURI.ROOT_COLLECTION_URI.append("testIndexConfiguration"); private final static XmldbURI COLLECTION_SUB1 = TEST_COLLECTION.append("sub1"); private final static XmldbURI COLLECTION_SUB2 = COLLECTION_SUB1.append("sub2"); private static final XmldbURI CONF_COLL_URI = XmldbURI.CONFIG_COLLECTION_URI.append(TEST_COLLECTION); private static final XmldbURI CONF_COLL_URI2 = CONF_COLL_URI.append(TestConstants.SPECIAL_NAME); //private static final String CONF_COLL_PATH = CollectionConfigurationManager.CONFIG_COLLECTION // + DBBroker.ROOT_COLLECTION + "/" + TEST_COLLECTION; //private final static String coll1 = CONF_COLL_PATH; //private final static String coll2 = coll1 + "/" + TEST_COLLECTION_2; //private final static String TestConstants.TEST_XML_URI = "test.xml"; private static final XmldbURI TEST_CONFIG_NAME_1 = XmldbURI.create("test1.xconf"); private static final XmldbURI TEST_CONFIG_NAME_2 = XmldbURI.create(TestConstants.SPECIAL_NAME.toString()+".xconf"); private final static String DOCUMENT_CONTENT = "<test>" + "<a>001</a>" + "<a>01</a>" + "<a>1</a>" + "<b>001</b>" + "<b>01</b>" + "<b>1</b>" + "</test>"; private final static String DOCUMENT_CONTENT2 = "<test x='0'>" + "<c c='2002-12-07T12:20:46.275+01:00'>2002-12-07T12:20:46.275+01:00</c>" + "<d d='1'>1</d>" + "<e e='1'>1</e>" + "<f f='true'>true</f>" +" <g g='1'>1</g>" +"<h h='1'>1</h>" + "<test x='1'><test x='2'></test></test></test>"; private final static String DOCUMENT_CONTENT3 = "<test>" + " <a>1</a>" + " <b>1</b>" + " <c>1</c>" + " <d>x</d>" + " <e>xx</e>" + " <f>xxx</f>" + "</test>"; private String CONFIG1 = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " <create qname=\"a\" type=\"xs:integer\"/>" + " <create qname=\"b\" type=\"xs:string\"/>" + " <create path=\"//a\" type=\"xs:integer\"/>" + " <create path=\"//b\" type=\"xs:string\"/>" + " </index>" + "</collection>"; private String CONFIG2 = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " <create path=\"//c\" type=\"xs:dateTime\"/>" + " <create path=\"//d\" type=\"xs:double\"/>" + " <create path=\"//e\" type=\"xs:float\"/>" + " <create path=\"//f\" type=\"xs:boolean\"/>" + " <create path=\"//g\" type=\"xs:integer\"/>" + " <create path=\"//h\" type=\"xs:string\"/>" + " <create path=\"//@c\" type=\"xs:dateTime\"/>" + " <create path=\"//@d\" type=\"xs:double\"/>" + " <create path=\"//@e\" type=\"xs:float\"/>" + " <create path=\"//@f\" type=\"xs:boolean\"/>" + " <create path=\"//@g\" type=\"xs:integer\"/>" + " <create path=\"//@h\" type=\"xs:string\"/>" + " <create path=\"//test/@x\" type=\"xs:integer\"/>" + " </index>" + "</collection>"; private String CONFIG3 = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " <create qname=\"a\" type=\"xs:integer\"/>" + " <create path=\"//a\" type=\"xs:integer\"/>" + " </index>" + "</collection>"; private String QNAME_CONFIG = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " <create qname=\"a\" type=\"xs:integer\"/>" + " <create qname=\"b\" type=\"xs:integer\"/>" + " <create path=\"/test/c\" type=\"xs:integer\"/>" + " <create qname=\"d\" type=\"xs:string\"/>" + " <create qname=\"e\" type=\"xs:string\"/>" + " <create path=\"/test/f\" type=\"xs:string\"/>" + " </index>" + "</collection>"; private String QNAME_CONFIG2 = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " <create qname=\"c\" type=\"xs:dateTime\"/>" + " <create qname=\"d\" type=\"xs:double\"/>" + " <create qname=\"e\" type=\"xs:float\"/>" + " <create qname=\"f\" type=\"xs:boolean\"/>" + " <create qname=\"g\" type=\"xs:integer\"/>" + " <create qname=\"h\" type=\"xs:string\"/>" + " <create qname=\"@c\" type=\"xs:dateTime\"/>" + " <create qname=\"@d\" type=\"xs:double\"/>" + " <create qname=\"@e\" type=\"xs:float\"/>" + " <create qname=\"@f\" type=\"xs:boolean\"/>" + " <create qname=\"@g\" type=\"xs:integer\"/>" + " <create qname=\"@h\" type=\"xs:string\"/>" + " <create qname=\"@x\" type=\"xs:integer\"/>" + " </index>" + "</collection>"; private String EMPTY_CONFIG = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">" + " <index>" + " </index>" + "</collection>"; private String INVALID_CONFIG1 = "<collection xmlns=\"http://exist-db.org/collection-config/1.0\">\n" + " <triggers>\n" + " <trigger event=\"store,update,remove\" class=\"org.exist.NonExistingTrigger\">\n" + " </trigger>\n" + " </triggers>\n" + " <index>\n" + " <create foo=\"a\" type=\"xs:integer\"/>\n" + " </index>\n" + "</collection>"; private Collection testCollection; protected void setUp() { try { // initialize driver Class cl = Class.forName(DRIVER); Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); Collection root = DatabaseManager.getCollection(URI + DBBroker.ROOT_COLLECTION, "admin", null); CollectionManagementService service = (CollectionManagementService) root .getService("CollectionManagementService", "1.0"); testCollection = service.createCollection(TEST_COLLECTION.toString()); assertNotNull(testCollection); Collection configColl = DatabaseManager.getCollection(URI + CONF_COLL_URI.toString(), "admin", null); if(configColl == null) { System.out.println("creating collection '" + CONF_COLL_URI + "'"); CollectionManagementService cms = (CollectionManagementService)testCollection.getService("CollectionManagementService", "1.0"); configColl = cms.createCollection(CONF_COLL_URI.toString()); } if(configColl == null) { fail("Could not create config collection: "+CONF_COLL_URI); } } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } protected void tearDown() { try { Collection root = DatabaseManager.getCollection(URI + DBBroker.ROOT_COLLECTION, "admin", null); CollectionManagementService service = (CollectionManagementService) root .getService("CollectionManagementService", "1.0"); service.removeCollection(TEST_COLLECTION.toString()); testCollection = null; //Removes the collection config collection *manually* Collection confCol = DatabaseManager.getCollection(URI + CONF_COLL_URI, "admin", null); if (confCol != null) service.removeCollection(CONF_COLL_URI.toString()); DatabaseInstanceManager mgr = (DatabaseInstanceManager) root.getService("DatabaseInstanceManager", "1.0"); mgr.shutdown(); } catch (Exception e) { fail(e.getMessage()); } } public void testCollectionConfigurationService1() { ResourceSet result; try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); //3 numeric values result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); //... but 1 string value result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testCollectionConfigurationService2() { ResourceSet result; try { // Add document.... XMLResource doc = (XMLResource) testCollection.createResource( TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); // ... then configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection .getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); XPathQueryService service = (XPathQueryService) testCollection .getService("XPathQueryService", "1.0"); // No numeric values because we have no index result = service.query("util:index-key-occurrences( /test/a, 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); assertEquals(0, result.getSize()); // No numeric values because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); // ...let's activate the index idxConf.reindexCollection(); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); // 3 numeric values result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); // ... but 1 string value result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testCollectionConfigurationService3() { ResourceSet result; try { //Configure collection *manually* storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(1, result.getSize()); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); //3 numeric values result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); //... but 1 string value result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testCollectionConfigurationService4() { ResourceSet result; try { // Add document.... XMLResource doc = (XMLResource) testCollection.createResource( TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); // ... then configure collection *manually* storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); XPathQueryService service = (XPathQueryService) testCollection .getService("XPathQueryService", "1.0"); // No numeric values because we have no index result = service.query("util:index-key-occurrences( /test/a, 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); assertEquals(0, result.getSize()); // No numeric values because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); // ...let's activate the index IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.reindexCollection(); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); // 3 numeric values result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); // ... but 1 string value result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch (Exception e) { fail(e.getMessage()); } } public void testCollectionConfigurationService5() { ResourceSet result; try { //Configure collection *manually* XmldbURI configurationFileName = XmldbURI.create("foo" + CollectionConfiguration.COLLECTION_CONFIG_SUFFIX); storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); // ... then configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection .getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); // Add document.... XMLResource doc = (XMLResource) testCollection.createResource( TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection .getService("XPathQueryService", "1.0"); //our config file result = service.query("xmldb:get-child-resources('" + CONF_COLL_URI + "')"); assertEquals(configurationFileName.toString(), result.getResource(0).getContent()); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); // 3 numeric values result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); // ... but 1 string value result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch (Exception e) { fail(e.getMessage()); } } public void testCollectionConfigurationService6() { ResourceSet result; try { // Add document.... XMLResource doc = (XMLResource) testCollection.createResource( TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); //... then configure collection *manually* XmldbURI configurationFileName = XmldbURI.create("foo" + CollectionConfiguration.COLLECTION_CONFIG_SUFFIX); storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); //... then configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); XPathQueryService service = (XPathQueryService) testCollection .getService("XPathQueryService", "1.0"); //our config file result = service.query("xmldb:get-child-resources('" + CONF_COLL_URI + "')"); assertEquals(configurationFileName.toString(), result.getResource(0).getContent()); // No numeric values because we have no index result = service.query("util:index-key-occurrences( /test/a, 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); assertEquals(0, result.getSize()); // No numeric values because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); // No string value because we have no index result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); // ...let's activate the index idxConf.reindexCollection(); //WARNING : the code hereafter used to *not* work whereas //testCollectionConfigurationService4 did. //Adding confMgr.invalidateAll(getName()); in Collection.storeInternal solved the problem //Strange case that needs investigations... -pb //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); // 3 numeric values result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); // ... but 1 string value result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch (Exception e) { fail(e.getMessage()); } } /** Check if configurations are properly passed down the collection hierarchy. */ public void testCollectionConfigurationService7() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); //Configure collection automatically // sub2 should inherit its index configuration from the top collection IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); //... then index document XMLResource doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); XPathQueryService service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); //3 numeric values result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); //... but 1 string value result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** Overwrite configuration in a sub collection */ public void testCollectionConfigurationService8() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); // Overwrite main configuration with an empty configuration in the subcollection idxConf = (IndexQueryService) sub2.getService("IndexQueryService", "1.0"); idxConf.configureCollection(EMPTY_CONFIG); //... then index document XMLResource doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); XPathQueryService service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); // index should be empty result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(0, result.getSize()); result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** Overwrite configuration in a sub collection 2 times */ public void testCollectionConfigurationService9() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub1 = cms.createCollection(COLLECTION_SUB1.toString()); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); // Overwrite main configuration with an empty configuration in the subcollection idxConf = (IndexQueryService) sub1.getService("IndexQueryService", "1.0"); idxConf.configureCollection(EMPTY_CONFIG); // Overwrite sub1 configuration in sub2 idxConf = (IndexQueryService) sub2.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG3); //... then store document into sub1 XMLResource doc = (XMLResource) sub1.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub1.storeResource(doc); XPathQueryService service = (XPathQueryService) sub1.getService("XPathQueryService", "1.0"); // sub1 has empty configuration, so index should be empty as well result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(0, result.getSize()); result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); // remove document in sub1 and restore it in sub2 sub1.removeResource(doc); doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); // sub2 only has an index on /test/a, but not on /test/b //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(0, result.getSize()); // 3 numeric values result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); // ... but 1 string value result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** Remove config document */ public void testCollectionConfigurationService10() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); //... then index document XMLResource doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); XPathQueryService service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); //3 numeric values result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); //... but 1 string value result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); // remove config document thus dropping the configuration Collection confCol = DatabaseManager.getCollection(URI + XmldbURI.CONFIG_COLLECTION_URI.append(TEST_COLLECTION), "admin", null); Resource confDoc = confCol.getResource("collection.xconf"); assertNotNull(confDoc); confCol.removeResource(confDoc); // cms = (CollectionManagementService) confCol.getService("CollectionManagementService", "1.0"); // cms.removeCollection("."); idxConf.reindexCollection(); // index should be empty since configuration was removed result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(0, result.getSize()); result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } /** Remove config collection */ public void testCollectionConfigurationService11() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG1); //... then index document XMLResource doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); XPathQueryService service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); //3 numeric values result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals("3", result.getResource(0).getContent()); //... but 1 string value result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals("1", result.getResource(0).getContent()); //3 numeric values result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(3, result.getSize()); //... but 1 string value result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(1, result.getSize()); // remove config document thus dropping the configuration Collection confCol = DatabaseManager.getCollection(URI + XmldbURI.CONFIG_COLLECTION_URI.append(TEST_COLLECTION), "admin", null); cms = (CollectionManagementService) confCol.getService("CollectionManagementService", "1.0"); cms.removeCollection("."); idxConf.reindexCollection(); // index should be empty since configuration was removed result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(0, result.getSize()); result = service.query("util:index-key-occurrences(/test/b, \"1\")"); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); assertEquals(0, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testInvalidConfiguration1() { ResourceSet result; try { CollectionManagementService cms = (CollectionManagementService) testCollection.getService("CollectionManagementService", "1.0"); Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(INVALID_CONFIG1); //... then index document XMLResource doc = (XMLResource) sub2.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource"); doc.setContent(DOCUMENT_CONTENT); sub2.storeResource(doc); XPathQueryService service = (XPathQueryService) sub2.getService("XPathQueryService", "1.0"); // index should be empty since configuration was invalid result = service.query("util:index-key-occurrences(/test/a, 1)"); assertEquals(0, result.getSize()); result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); assertEquals(0, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testRangeIndex1() { ResourceSet result; try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG2); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT2); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); result = service.query("util:index-key-occurrences(/test/c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/c)"); assertEquals("xs:dateTime", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/d, xs:double(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/d)"); assertEquals("xs:double", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/e, xs:float(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/e)"); assertEquals("xs:float", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/f, true())"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/f)"); assertEquals("xs:boolean", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/g, xs:integer(1))"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/g)"); assertEquals("xs:integer", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/h, '1')"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/h)"); assertEquals("xs:string", result.getResource(0).getContent()); result = service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { d = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { e = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test/f[(# exist:force-index-use #) { . = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { f = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test/g[(# exist:force-index-use #) { . = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { g = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test/h[(# exist:force-index-use #) { . = '1' }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { h = '1' }]"); assertEquals(1, result.getSize()); boolean exceptionCaught = false; try { result = service.query("/test[(# exist:force-index-use #) { contains(d, '1') }]"); assertEquals(0, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue("contains() should not use index of type xs:double", exceptionCaught); exceptionCaught = false; try { result = service.query("/test[(# exist:force-index-use #) { matches(d, '1') }]"); assertEquals(0, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue("matches() should not use index of type xs:double", exceptionCaught); result = service.query("/test[matches(h, '1')]"); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testRangeIndex2() { ResourceSet result; try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(QNAME_CONFIG2); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT2); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); result = service.query("util:index-key-occurrences(/test/c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/c)"); assertEquals("xs:dateTime", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/d, xs:double(1) )"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/d)"); assertEquals("xs:double", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/e, xs:float(1) )"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/e)"); assertEquals("xs:float", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/f, true())"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/f)"); assertEquals("xs:boolean", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/g, xs:integer(1))"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/g)"); assertEquals("xs:integer", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/h, '1')"); assertEquals(1, result.getSize()); assertEquals("2", result.getResource(0).getContent()); result = service.query("util:index-type(/test/h)"); assertEquals("xs:string", result.getResource(0).getContent()); result = service.query("(# exist:force-index-use #) { /test/c[. = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\")] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\")] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test/d[. = xs:double(1)] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[d = xs:double(1)] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test/e[. = xs:float(1)] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[e = xs:float(1)] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test/f[. = true()] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[f = true()] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test/g[. = 1] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[g = 1] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test/h[. = '1'] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[h = '1'] }"); assertEquals(1, result.getSize()); boolean exceptionCaught = false; try { result = service.query("(# exist:force-index-use #) { /test[contains(d, '1')] }"); assertEquals(0, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue("contains() should not use index of type xs:double", exceptionCaught); exceptionCaught = false; try { result = service.query("(# exist:force-index-use #) { /test[matches(d, '1')] }"); assertEquals(0, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue("matches() should not use index of type xs:double", exceptionCaught); result = service.query("/test[matches(h, '1')]"); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testRangeIndex3() { try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(QNAME_CONFIG); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT3); testCollection.storeResource(doc); XQueryService service = (XQueryService) testCollection.getService("XQueryService", "1.0"); // the query optimizer cannot optimize the following general comparison as // the context qname is unknown. however, the available qname index should still be used. ResourceSet result = service.query("(# exist:force-index-use #) { for $t in /test/a where $t = 1 return $t}"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/d where contains($t, 'x') return $t}"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/d where matches($t, 'x$') return $t}"); assertEquals(1, result.getSize()); // left operand to comparison uses nodes from different elements, both having an index defined // by qname: use qname index result = service.query("(# exist:force-index-use #) { for $t in /test/(a|b) where $t = 1 return $t}"); assertEquals(2, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where contains($t, 'x') return $t}"); assertEquals(2, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where matches($t, 'x$') return $t}"); assertEquals(2, result.getSize()); // left operand to comparison uses nodes from different elements with mixed indexes, // some defined on qname, one defined by path: comparison needs to scan all 3 indexes. result = service.query("(# exist:force-index-use #) { for $t in /test/(a|b|c) where $t = 1 return $t}"); assertEquals(3, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where contains($t, 'x') return $t}"); assertEquals(3, result.getSize()); result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where matches($t, 'x$') return $t}"); assertEquals(3, result.getSize()); // left operand has index defined on path. other elements in the collection use indexes // on qname: comparison needs to scan all index types. result = service.query("(# exist:force-index-use #) { for $t in /test/c where $t = 1 return $t}"); assertEquals(1, result.getSize()); // simple comparison, left operand has index defined on path. result = service.query("(# exist:force-index-use #) { /test[c = 1] }"); assertEquals(1, result.getSize()); result = service.query("(# exist:force-index-use #) { /test[matches(d, 'x')] }"); assertEquals(1, result.getSize()); // wrong index type: can't use fn:contains with an integer index boolean exceptionCaught = false; try { result = service.query("(# exist:force-index-use #) { for $t in /test/c where contains($t, '1') return $t}"); assertEquals(1, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue(exceptionCaught); // wrong index type: can't use fn:matches with an integer index exceptionCaught = false; try { result = service.query("(# exist:force-index-use #) { for $t in /test/c where matches($t, '1') return $t}"); assertEquals(1, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue(exceptionCaught); // wrong index type: can't use fn:matches with an integer index exceptionCaught = false; try { result = service.query("(# exist:force-index-use #) { /test[matches(c, '1')] }"); assertEquals(1, result.getSize()); } catch (XMLDBException e) { exceptionCaught = true; } assertTrue(exceptionCaught); } catch (XMLDBException e) { e.printStackTrace(); fail(e.getMessage()); } } public void testRangeIndexOverAttributes() { ResourceSet result; try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); idxConf.configureCollection(CONFIG2); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT2); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); result = service.query("//test[@x = 0]"); assertEquals(1, result.getSize()); result = service.query("//test[@x eq 0]"); assertEquals(1, result.getSize()); result = service.query("//test[(# exist:force-index-use #) { @x = 0 }]"); assertEquals(1, result.getSize()); result = service.query("//test[(# exist:force-index-use #) { @x eq 0 }]"); assertEquals(1, result.getSize()); result = service.query("util:index-key-occurrences(/test//@c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@c)"); assertEquals("xs:dateTime", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/c/@c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/c/@c)"); assertEquals("xs:dateTime", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test//@d, xs:double(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@d)"); assertEquals("xs:double", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/d/@d, xs:double(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/d/@d)"); assertEquals("xs:double", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test//@e, xs:float(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@e)"); assertEquals("xs:float", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/e/@e, xs:float(1) )"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/e/@e)"); assertEquals("xs:float", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test//@f, true())"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@f)"); assertEquals("xs:boolean", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/f/@f, true())"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/f/@f)"); assertEquals("xs:boolean", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test//@g, xs:integer(1))"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@g)"); assertEquals("xs:integer", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/g/@g, xs:integer(1))"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/g/@g)"); assertEquals("xs:integer", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test//@h, '1')"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test//@h)"); assertEquals("xs:string", result.getResource(0).getContent()); result = service.query("util:index-key-occurrences(/test/h/@h, '1')"); assertEquals(1, result.getSize()); assertEquals("1", result.getResource(0).getContent()); result = service.query("util:index-type(/test/h/@h)"); assertEquals("xs:string", result.getResource(0).getContent()); result = service.query("/test//@c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test/c/@c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./c/@c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); assertEquals(1, result.getSize()); result = service.query("/test//@d[(# exist:force-index-use #) { . = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@d = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test/d/@d[(# exist:force-index-use #) { . = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./d/@d = xs:double(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test//@e[(# exist:force-index-use #) { . = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@e = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test/e/@e[(# exist:force-index-use #) { . = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./e/@e = xs:float(1) }]"); assertEquals(1, result.getSize()); result = service.query("/test//@f[(# exist:force-index-use #) { . = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@f = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test/f/@f[(# exist:force-index-use #) { . = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./f/@f = true() }]"); assertEquals(1, result.getSize()); result = service.query("/test//@g[(# exist:force-index-use #) { . = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@g = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test/g/@g[(# exist:force-index-use #) { . = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./g/@g = 1 }]"); assertEquals(1, result.getSize()); result = service.query("/test//@h[(# exist:force-index-use #) { . = '1' }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { .//@h = '1' }]"); assertEquals(1, result.getSize()); result = service.query("/test/h/@h[(# exist:force-index-use #) { . = '1' }]"); assertEquals(1, result.getSize()); result = service.query("/test[(# exist:force-index-use #) { ./h/@h = '1' }]"); assertEquals(1, result.getSize()); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testMissingRangeIndexes() { ResourceSet result; boolean exceptionThrown = false; try { //Configure collection automatically IndexQueryService idxConf = (IndexQueryService) testCollection.getService("IndexQueryService", "1.0"); //... then index document XMLResource doc = (XMLResource) testCollection.createResource(TestConstants.TEST_XML_URI.toString(), "XMLResource" ); doc.setContent(DOCUMENT_CONTENT2); testCollection.storeResource(doc); XPathQueryService service = (XPathQueryService) testCollection.getService("XPathQueryService", "1.0"); try { exceptionThrown = false; result = service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); } catch (Exception e) { e.printStackTrace(); if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); try { exceptionThrown = false; result = service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]"); } catch (Exception e) { if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); try { exceptionThrown = false; result = service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]"); } catch (Exception e) { if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); try { exceptionThrown = false; result = service.query("/test/f[(# exist:force-index-use #) { . = true() }]"); } catch (Exception e) { if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); try { exceptionThrown = false; result = service.query("/test/g[(# exist:force-index-use #) { . = 1 }]"); } catch (Exception e) { if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); try { exceptionThrown = false; result = service.query("/test/h[(# exist:force-index-use #) { . = '1' }]"); } catch (Exception e) { if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) exceptionThrown = true; else throw e; } assertTrue("Exception expected : missing index", exceptionThrown); } catch(Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testMultipleConfigurations00() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_1, CONF_COLL_URI, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations01() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_1, CONF_COLL_URI, TEST_CONFIG_NAME_2, false); } public void testMultipleConfigurations02() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_1, CONF_COLL_URI2, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations03() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_1, CONF_COLL_URI2, TEST_CONFIG_NAME_2, true); } public void testMultipleConfigurations04() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_2, CONF_COLL_URI, TEST_CONFIG_NAME_1, false); } public void testMultipleConfigurations05() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_2, CONF_COLL_URI, TEST_CONFIG_NAME_2, true); } public void testMultipleConfigurations06() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_2, CONF_COLL_URI2, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations07() { checkStoreConf(CONF_COLL_URI, TEST_CONFIG_NAME_2, CONF_COLL_URI2, TEST_CONFIG_NAME_2, true); } public void testMultipleConfigurations08() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_1, CONF_COLL_URI, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations09() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_1, CONF_COLL_URI, TEST_CONFIG_NAME_2, true); } public void testMultipleConfigurations10() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_1, CONF_COLL_URI2, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations11() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_1, CONF_COLL_URI2, TEST_CONFIG_NAME_2, false); } public void testMultipleConfigurations12() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_2, CONF_COLL_URI, TEST_CONFIG_NAME_1, true); } public void testMultipleConfigurations13() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_2, CONF_COLL_URI, TEST_CONFIG_NAME_2, true); } public void testMultipleConfigurations14() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_2, CONF_COLL_URI2, TEST_CONFIG_NAME_1, false); } public void testMultipleConfigurations15() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_2, CONF_COLL_URI2, TEST_CONFIG_NAME_2, true); } private void checkStoreConf(XmldbURI coll1, XmldbURI confName1, XmldbURI coll2, XmldbURI confName2, boolean shouldSucceed) { try { storeConfiguration(coll1, confName1, CONFIG1); storeConfiguration(coll2, confName2, CONFIG1); if(!shouldSucceed) { fail("Should not have been able to store '" + confName1 + "' to '" + coll1 + "'\n\tand then '" + confName2 + "' to '" + coll2 + "'"); } } catch (XMLDBException xe) { if(shouldSucceed) { fail("Should have been able to store '" + confName1 + "' to '" + coll1 + "'\n\tand then '" + confName2 + "' to '" + coll2 + "': " + xe.getMessage()); } } } private void storeConfiguration(XmldbURI collPath, XmldbURI confName, String confContent) throws XMLDBException { String fullCollPath = URI + collPath.toString(); System.out.println("Storing configuration '" + confName + "' to '" + collPath + "'" ); Collection configColl = DatabaseManager.getCollection(fullCollPath, "admin", null); if(configColl == null) { CollectionManagementService cms = (CollectionManagementService)testCollection.getService("CollectionManagementService", "1.0"); configColl = cms.createCollection(collPath.toString()); } assertNotNull(configColl); Resource res = configColl.createResource(confName.toString(), "XMLResource"); assertNotNull(res); res.setContent(confContent); configColl.storeResource(res); } public static void main(String[] args) { junit.textui.TestRunner.run(CollectionConfigurationTest.class); } }