Index: servlets/src/main/java/org/hippoecm/repository/RepositoryServlet.java =================================================================== --- servlets/src/main/java/org/hippoecm/repository/RepositoryServlet.java (revision 57570) +++ servlets/src/main/java/org/hippoecm/repository/RepositoryServlet.java (working copy) @@ -37,6 +37,7 @@ import javax.jcr.LoginException; import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.observation.Event; @@ -52,7 +53,6 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.api.observation.JackrabbitEvent; -import org.hippoecm.repository.api.HippoNodeIterator; import org.hippoecm.repository.audit.AuditLogger; import org.hippoecm.repository.decorating.server.ServerServicingAdapterFactory; import org.hippoecm.repository.util.RepoUtils; @@ -384,44 +384,47 @@ if (searchType != null && !"uuid".equals(searchType)) { String limit = "1000"; - boolean isXPathQuery = false; + String queryLanguage = Query.XPATH; String queryString = ""; if ("text".equals(searchType)) { limit = req.getParameter("text-limit"); - isXPathQuery = true; queryString = req.getParameter("text"); templateParams.put("originalQuery", queryString); if(StringUtils.isNotBlank(queryString)) { queryString = "//*[jcr:contains(* , '" + queryString + "') ]"; } - queryString = addOrderbyClause(queryString, true); + queryString = addOrderbyClause(queryString, Query.XPATH); - } else if ("xpath".equals(searchType)) { + } else if (Query.XPATH.equals(searchType)) { limit = req.getParameter("xpath-limit"); - isXPathQuery = true; queryString = req.getParameter("xpath").trim(); templateParams.put("originalQuery", queryString); - queryString = addOrderbyClause(queryString, true); + queryString = addOrderbyClause(queryString, Query.XPATH); - } else if ("sql".equals(searchType)) { + } else if (Query.SQL.equals(searchType)) { limit = req.getParameter("sql-limit"); - isXPathQuery = false; + queryLanguage = Query.SQL; queryString = req.getParameter("sql").trim(); templateParams.put("originalQuery", queryString); - queryString = addOrderbyClause(queryString, false); + queryString = addOrderbyClause(queryString, Query.SQL); + } else if (Query.JCR_SQL2.equals(searchType)) { + limit = req.getParameter("JCR-SQL2-limit"); + queryLanguage = Query.JCR_SQL2; + queryString = req.getParameter("JCR-SQL2").trim(); + templateParams.put("originalQuery", queryString); + queryString = addOrderbyClause(queryString, Query.JCR_SQL2); } QueryManager qmgr = jcrSession.getWorkspace().getQueryManager(); - String language = (isXPathQuery ? Query.XPATH: Query.SQL); Query query; - if (isXPathQuery) { + if (Query.XPATH.equals(queryLanguage)) { // we encode xpath queries to support queries like /jcr:root/7_8//* // the 7 needs to be encode - query = qmgr.createQuery(RepoUtils.encodeXpath(queryString), language); + query = qmgr.createQuery(RepoUtils.encodeXpath(queryString), queryLanguage); } else { - query = qmgr.createQuery(queryString, language); + query = qmgr.createQuery(queryString, queryLanguage); } if (limit != null && !limit.isEmpty()) { @@ -429,8 +432,23 @@ } QueryResult queryResult = query.execute(); + + List queryResultNodePaths = new LinkedList<>(); + Node node; + for (NodeIterator nodeIt = queryResult.getNodes(); nodeIt.hasNext(); ) { + node = nodeIt.nextNode(); + if (node != null) { + queryResultNodePaths.add(node.getPath()); + } + } + templateParams.put("queryResultNodePaths", queryResultNodePaths); + + // retrieve result again because JCR-SQL2 query result doesn't seem to support iterating again from the query result (yet). + if (Query.JCR_SQL2.equals(queryLanguage)) { + queryResult = query.execute(); + } + templateParams.put("queryResult", queryResult); - templateParams.put("queryResultTotalSize", ((HippoNodeIterator) queryResult.getNodes()).getTotalSize()); } @@ -544,10 +562,17 @@ } } - private String addOrderbyClause(String queryString, boolean isXPath) { - if(!queryString.toLowerCase().contains("order by")) { - return queryString + " order by " + (isXPath ? "@" : "") + "jcr:score"; + private String addOrderbyClause(final String queryString, final String queryLanguage) { + if (!queryString.toLowerCase().contains("order by")) { + if (Query.XPATH.equals(queryLanguage)) { + return queryString + " order by @jcr:score"; + } else if (Query.SQL.equals(queryLanguage)) { + return queryString + " order by jcr:score"; + } else if (Query.JCR_SQL2.equals(queryLanguage)) { + return queryString + " order by [jcr:score]"; + } } + return queryString; } Index: servlets/src/main/resources/org/hippoecm/repository/RepositoryServlet-html.ftl =================================================================== --- servlets/src/main/resources/org/hippoecm/repository/RepositoryServlet-html.ftl (revision 57570) +++ servlets/src/main/resources/org/hippoecm/repository/RepositoryServlet-html.ftl (working copy) @@ -58,18 +58,27 @@ .search-type-selector #uuid-select:checked ~ .search-params .text-tab {display:none} .search-type-selector #uuid-select:checked ~ .search-params .xpath-tab {display:none} .search-type-selector #uuid-select:checked ~ .search-params .sql-tab {display:none} + .search-type-selector #uuid-select:checked ~ .search-params .JCR-SQL2-tab {display:none} .search-type-selector #text-select:checked ~ .search-params .uuid-tab {display:none} .search-type-selector #text-select:checked ~ .search-params .xpath-tab {display:none} .search-type-selector #text-select:checked ~ .search-params .sql-tab {display:none} + .search-type-selector #text-select:checked ~ .search-params .JCR-SQL2-tab {display:none} .search-type-selector #xpath-select:checked ~ .search-params .uuid-tab {display:none} .search-type-selector #xpath-select:checked ~ .search-params .text-tab {display:none} .search-type-selector #xpath-select:checked ~ .search-params .sql-tab {display:none} + .search-type-selector #xpath-select:checked ~ .search-params .JCR-SQL2-tab {display:none} .search-type-selector #sql-select:checked ~ .search-params .uuid-tab {display:none} .search-type-selector #sql-select:checked ~ .search-params .text-tab {display:none} .search-type-selector #sql-select:checked ~ .search-params .xpath-tab {display:none} + .search-type-selector #sql-select:checked ~ .search-params .JCR-SQL2-tab {display:none} + + .search-type-selector #JCR-SQL2-select:checked ~ .search-params .uuid-tab {display:none} + .search-type-selector #JCR-SQL2-select:checked ~ .search-params .text-tab {display:none} + .search-type-selector #JCR-SQL2-select:checked ~ .search-params .xpath-tab {display:none} + .search-type-selector #JCR-SQL2-select:checked ~ .search-params .sql-tab {display:none} @@ -102,6 +111,8 @@ checked="checked"> + checked="checked"> +
@@ -131,6 +142,14 @@
Limit:
+ + <#--JCR-SQL2--> +
+ +
+ Limit: +
+ @@ -226,58 +245,98 @@ XPath query:  <#elseif searchType == 'sql'> SQL query:  + <#elseif searchType == 'JCR-SQL2'> + JCR-SQL2 query:  ${originalQuery?html} - <#assign queryResultNodes = queryResult.nodes> - Number of results found: ${queryResultTotalSize!-1} + Number of results found: ${queryResultNodePaths?size!-1}
    - <#list queryResultNodes as node> - <#if node??> -
  1. - ${node.path} + <#list queryResultNodePaths as nodePath> +
  2. + ${nodePath} <#-- TODO - writer.println("c"); - writer.println("cms"); - writer.println("r"); + writer.println("c"); + writer.println("cms"); + writer.println("r"); --> - -
  3. - +

- - - - <#list queryResult.columnNames as columnName> - - - - <#list queryResult.rows as row> - <#if row??> - - - <#assign values = row.values> - <#if values??> - <#list row.values as value> + <#if searchType == "JCR-SQL2"> + + <#assign columnNames = []> + <#list queryResult.columnNames as columnName> + <#if columnName != "jcr:path" && columnName != "jcr:score"> + <#assign columnNames = columnNames + [ columnName ]> + + + +
#${columnName}
${row_index + 1}
+ + + + + <#list columnNames as columnName> + + + + <#list queryResult.rows as row> + <#if row??> + + + + + <#list columnNames as columnName> + <#assign value = row.getValue(columnName)> <#if value?? && value.type != 2> <#else> - - - - -
#PathScore${columnName}
${row_index + 1}${row.path}${row.score}${value.string!}
+ + + + + + <#else> + + + + + <#list queryResult.columnNames as columnName> + + + + <#list queryResult.rows as row> + <#if row??> + + + <#assign values = row.values> + <#if values??> + <#list row.values as value> + <#if value?? && value.type != 2> + + <#else> + + + + + + + +
#${columnName}
${row_index + 1}${value.string!}
+ + + <#if repositoryMap??>