/* * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.jcr.impl.core.query; import org.exoplatform.services.jcr.api.core.query.AbstractIndexingTest; import java.util.Calendar; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; /** * Created by The eXo Platform SAS. * * <br>Date: * * @author <a href="karpenko.sergiy@gmail.com">Karpenko Sergiy</a> * @version $Id: TestSimilarity.java 111 2008-11-11 11:11:11Z serg $ */ public class TestSimilarity extends AbstractIndexingTest { public void testFindSimilarNodes() throws Exception { //base node Node file = testRootNode.addNode("baseFile", "nt:file"); Node resource = file.addNode("jcr:content", "nt:resource"); resource.setProperty("jcr:lastModified", Calendar.getInstance()); resource.setProperty("jcr:encoding", "UTF-8"); resource.setProperty("jcr:mimeType", "text/plain"); resource .setProperty( "jcr:data", "Similarity is determined by looking up terms that are common to nodes. " + "There are some conditions that must be met for a term to be considered. This is required to limit the number possibly relevant terms." + "Only terms with at least 4 characters are considered." + "Only terms that occur at least 2 times in the source node are considered." + "Only terms that occur in at least 5 nodes are considered."); session.save(); // target nodes Node target1 = testRootNode.addNode("target1", "nt:file"); Node resource1 = target1.addNode("jcr:content", "nt:resource"); resource1.setProperty("jcr:lastModified", Calendar.getInstance()); resource1.setProperty("jcr:encoding", "UTF-8"); resource1.setProperty("jcr:mimeType", "text/plain"); resource1.setProperty("jcr:data", "Similarity is determined by looking up terms that are common to nodes."); Node target2 = testRootNode.addNode("target2", "nt:file"); Node resource2 = target2.addNode("jcr:content", "nt:resource"); resource2.setProperty("jcr:lastModified", Calendar.getInstance()); resource2.setProperty("jcr:encoding", "UTF-8"); resource2.setProperty("jcr:mimeType", "text/plain"); resource2.setProperty("jcr:data", "There is no you know what"); Node target3 = testRootNode.addNode("target3", "nt:file"); Node resource3 = target3.addNode("jcr:content", "nt:resource"); resource3.setProperty("jcr:lastModified", Calendar.getInstance()); resource3.setProperty("jcr:encoding", "UTF-8"); resource3.setProperty("jcr:mimeType", "text/plain"); resource3.setProperty("jcr:data", "Terms occures here terms"); session.save(); //Lets find similar nodes - will return base and similar target nodes // make SQL query QueryManager qman = session.getWorkspace().getQueryManager(); Query q = qman.createQuery("select * from nt:resource where similar(.,'/testroot/baseFile/jcr:content')", Query.SQL); QueryResult result = q.execute(); assertEquals(3, result.getNodes().getSize()); checkResult(result, new Node[]{resource, resource1, resource3}); //make XPath query Query xq = qman.createQuery("//element(*, nt:resource)[rep:similar(., '/testroot/baseFile/jcr:content')]", Query.XPATH); QueryResult xres = xq.execute(); assertEquals(3, xres.getNodes().getSize()); checkResult(xres, new Node[]{resource, resource1, resource3}); } public void testSimilar() throws RepositoryException { executeQuery("//*[rep:similar(., '" + testRootNode.getPath() + "')]"); executeQuery("//*[rep:similar(node, '" + testRootNode.getPath() + "')]"); } }