/* * Copyright 2011 JBoss Inc * * Licensed 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. */ package org.artificer.repository.test; import org.artificer.common.ArtifactContent; import org.artificer.common.ArtifactType; import org.artificer.common.ArtificerModelUtils; import org.artificer.common.query.ArtifactSummary; import org.artificer.repository.query.ArtificerQuery; import org.artificer.repository.query.PagedResult; import org.junit.Assert; import org.junit.Test; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactEnum; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XmlDocument; import java.io.InputStream; import java.util.Date; import java.util.UUID; /** * @author <a href="mailto:kurt.stam@gmail.com">Kurt Stam</a> */ public class QueryManagerTest extends AbstractNoAuditingPersistenceTest { /** * Tests the query manager. * @throws Exception */ @Test public void testQueryManager() throws Exception { // First, store an artifact. BaseArtifactType artifact = createXmlDocument("PO.xml", 1); log.info("persisted, returned artifact uuid=" + artifact.getUuid()); // Now query for it ArtificerQuery query = queryManager.createQuery("/s-ramp/core/XmlDocument"); PagedResult<ArtifactSummary> artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); ArtifactSummary found = artifactSet.getResults().get(0); Assert.assertNotNull("Expected artifact not found in artifact set.", found); Assert.assertEquals(artifact.getUuid(), found.getUuid()); Assert.assertEquals(artifact.getName(), found.getName()); Assert.assertEquals(artifact.getDescription(), found.getDescription()); } /** * Tests querying by s-ramp properties. * @throws Exception */ @Test public void testQueryByProperty() throws Exception { String uniquePropVal1 = UUID.randomUUID().toString(); String uniquePropVal2 = UUID.randomUUID().toString(); String uniquePropVal3 = UUID.randomUUID().toString(); // First, store 3 artifacts BaseArtifactType artifact1 = createXmlDocument("PO.xml", 1); BaseArtifactType artifact2 = createXmlDocument("PO.xml", 2); BaseArtifactType artifact3 = createXmlDocument("PO.xml", 3); // Now update some properties on them. // Prop3 is on all 3 artifacts, prop2 is on 2 artifacts, prop1 is on 1 artifact ArtificerModelUtils.setCustomProperty(artifact1, "prop1", uniquePropVal1); ArtificerModelUtils.setCustomProperty(artifact1, "prop2", uniquePropVal2); ArtificerModelUtils.setCustomProperty(artifact1, "prop3", uniquePropVal3); ArtificerModelUtils.setCustomProperty(artifact2, "prop2", uniquePropVal2); ArtificerModelUtils.setCustomProperty(artifact2, "prop3", uniquePropVal3); ArtificerModelUtils.setCustomProperty(artifact3, "prop3", uniquePropVal3); persistenceManager.updateArtifact(artifact1, ArtifactType.XmlDocument()); persistenceManager.updateArtifact(artifact2, ArtifactType.XmlDocument()); persistenceManager.updateArtifact(artifact3, ArtifactType.XmlDocument()); // Now query by various properties persistenceManager.printArtifactGraph(artifact1.getUuid(), ArtifactType.XmlDocument()); ArtificerQuery query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ?]"); query.setString(uniquePropVal1); PagedResult<ArtifactSummary> artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop2 = ?]"); query.setString(uniquePropVal2); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop3 = ?]"); query.setString(uniquePropVal3); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ?]"); query.setString("nomatches"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(0, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop2]"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ? and @prop2 = ?]"); query.setString(uniquePropVal1); query.setString(uniquePropVal2); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ? or @prop2 = ?]"); query.setString(uniquePropVal1); query.setString(uniquePropVal2); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@version = ?]"); query.setString("1.0.3"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@lastModifiedTimestamp < ?]"); query.setDate(new Date(System.currentTimeMillis() + 86400000L)); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertTrue(artifactSet.getTotalSize() >= 3); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@lastModifiedTimestamp > ?]"); query.setDate(new Date(System.currentTimeMillis() + 86400000L)); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(0, artifactSet.getTotalSize()); // Negation by property existence query = queryManager.createQuery("/s-ramp/core/XmlDocument[xp2:not(@prop1)]"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); // Negation by property value query = queryManager.createQuery("/s-ramp/core/XmlDocument[xp2:not(@prop1 = ?)]"); query.setString("nomatches"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); // AND'd negation by property value query = queryManager.createQuery("/s-ramp/core/XmlDocument[xp2:not(@prop1 = ? and @prop2 = ?)]"); query.setString(uniquePropVal1); query.setString(uniquePropVal2); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); } @Test public void testCustomPropertyBooleanValue() throws Exception { // Ensure that the repo can handle custom properties with boolean values. BaseArtifactType artifact = createXmlDocument("PO.xml", 1); ArtificerModelUtils.setCustomProperty(artifact, "prop1", "true"); persistenceManager.updateArtifact(artifact, ArtifactType.XmlDocument()); persistenceManager.printArtifactGraph(artifact.getUuid(), ArtifactType.XmlDocument()); ArtificerQuery query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ?]"); query.setString("true"); PagedResult<ArtifactSummary> artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); persistenceManager.printArtifactGraph(artifact.getUuid(), ArtifactType.XmlDocument()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ?]"); query.setString("false"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(0, artifactSet.getTotalSize()); persistenceManager.printArtifactGraph(artifact.getUuid(), ArtifactType.XmlDocument()); query = queryManager.createQuery("/s-ramp/core/XmlDocument[@prop1 = ?]"); query.setString("invalid"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(0, artifactSet.getTotalSize()); } @Test public void testFreeTextSearch() throws Exception { // First, store 3 XML artifacts BaseArtifactType artifact1 = createXmlDocument("PO.xml", 1); // content contains "Lawn Mower" and "Baby Monitor" BaseArtifactType artifact2 = createXmlDocument("PO.xml", 2); // content contains "Lawn Mower" and "Baby Monitor" BaseArtifactType artifact3 = createXmlDocument("PO2.xml", 3); // content contains "Leaf Blower" and "Baby Monitor" // In addition to 1 extended artifact BaseArtifactType artifact4 = addExtendedArtifact("FooType", "FooArtifact"); // Now update some properties on them ArtificerModelUtils.setCustomProperty(artifact1, "prop1", "fizz test"); ArtificerModelUtils.setCustomProperty(artifact2, "prop1", "buzz test"); ArtificerModelUtils.setCustomProperty(artifact3, "prop1", "fizz buzz test"); ArtificerModelUtils.setCustomProperty(artifact4, "prop1", "fizz buzz test"); persistenceManager.updateArtifact(artifact1, ArtifactType.XmlDocument()); persistenceManager.updateArtifact(artifact2, ArtifactType.XmlDocument()); persistenceManager.updateArtifact(artifact3, ArtifactType.XmlDocument()); persistenceManager.updateArtifact(artifact4, ArtifactType.valueOf(artifact4)); // full-text, using metadata ArtificerQuery query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("fizz"); PagedResult<ArtifactSummary> artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("buzz"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("test"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(4, artifactSet.getTotalSize()); // full-text, using content query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("Lawn Mower"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("Leaf Blower"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp[xp2:matches(., ?)]"); query.setString("Baby Monitor"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(3, artifactSet.getTotalSize()); // full-text, combined with metadata predicates query = queryManager.createQuery("/s-ramp[xp2:matches(., ?) and @name = ?]"); query.setString("fizz"); query.setString(artifact1.getName()); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); // full-text, combined with model/type (both are indexed and help further narrow-down the query) query = queryManager.createQuery("/s-ramp/core/XmlDocument[xp2:matches(., ?)]"); query.setString("fizz"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(2, artifactSet.getTotalSize()); query = queryManager.createQuery("/s-ramp/ext/FooType[xp2:matches(., ?)]"); query.setString("fizz"); artifactSet = query.executeQuery(); Assert.assertNotNull(artifactSet); Assert.assertEquals(1, artifactSet.getTotalSize()); } /** * @throws org.artificer.common.ArtificerException */ private BaseArtifactType createXmlDocument(String artifactFileName, int idx) throws Exception { InputStream content = this.getClass().getResourceAsStream("/sample-files/core/" + artifactFileName); XmlDocument document = (XmlDocument) ArtifactType.XmlDocument().newArtifactInstance(); document.setName(artifactFileName + "-" + idx); document.setVersion("1.0.3"); document.setArtifactType(BaseArtifactEnum.XML_DOCUMENT); BaseArtifactType artifact1 = persistenceManager.persistArtifact(document, new ArtifactContent(artifactFileName, content)); Assert.assertNotNull(artifact1); return artifact1; } }