/** * Map query term. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void mapFulltextQueryTearm( final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder, LOGICAL condition) { String keyword = queryCriteria.getKeyword(); if (keyword == null || keyword.length() == 0) return; QueryTermHelper queryTermHelper = new QueryTermHelper(); String queryTerm = null; if (isEnabledFuzzySearch) { if (keyword.contains("*") || keyword.contains("?") || keyword.contains("~")) { queryTerm = queryTermHelper.contains(keyword).buildTerm(); } else { queryTerm = queryTermHelper.contains(keyword).allowFuzzySearch(fuzzySearchIndex).buildTerm(); } } else { keyword = keyword.replace("~", "\\~"); keyword = keyword.replace("*", "\\*"); keyword = keyword.replace("?", "\\?"); queryTerm = queryTermHelper.contains(keyword).buildTerm(); } String[] props = queryCriteria.getFulltextSearchProperty(); if (props == null || props.length == 0 || QueryCriteria.ALL_PROPERTY_SCOPE.equals(props[0])) { queryBuilder.contains(null, queryTerm, LOGICAL.NULL); } else { queryBuilder.contains(props[0], queryTerm, LOGICAL.NULL); for (int i = 1; i < props.length; i++) { queryBuilder.contains(props[i], queryTerm, condition); } } }
/** * Map query term. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void mapFulltextQueryTearm( final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder, LOGICAL condition) { String queryString = queryCriteria.getKeyword(); if (queryString == null || queryString.length() == 0) return; int count = 0; for (String keyword : getKeywords(queryString, queryCriteria.isMultiplePhaseSearch())) { keyword = keyword.trim(); if (StringUtils.isBlank(keyword)) continue; QueryTermHelper queryTermHelper = new QueryTermHelper(); String queryTerm = null; if (isEnabledFuzzySearch) { if (keyword.contains("*") || keyword.contains("?") || keyword.contains("~")) { queryTerm = queryTermHelper.contains(keyword).buildTerm(); } else { queryTerm = queryTermHelper.contains(keyword).allowFuzzySearch(fuzzySearchIndex).buildTerm(); } } else { keyword = keyword.replace("~", "\\~"); keyword = keyword.replace("*", "\\*"); keyword = keyword.replace("?", "\\?"); queryTerm = queryTermHelper.contains(keyword).buildTerm(); } String[] props = queryCriteria.getFulltextSearchProperty(); if (props == null || props.length == 0 || QueryCriteria.ALL_PROPERTY_SCOPE.equals(props[0])) { queryBuilder.contains(null, queryTerm, (count++ == 0 ? LOGICAL.NULL : LOGICAL.OR)); } else { queryBuilder.contains(props[0], queryTerm, (count++ == 0 ? LOGICAL.NULL : LOGICAL.OR)); for (int i = 1; i < props.length; i++) { queryBuilder.contains(props[i], queryTerm, condition); } } } }
private QueryCriteria queryCriteriaCase( AttributeQueryCriteria criteria, List<AttributeReference.Key> arg) { final AttributeReference basicAttRef; if (arg.isEmpty()) { basicAttRef = criteria.getAttributeReference(); } else { basicAttRef = criteria.getAttributeReference().prepend(arg); } DisjunctionBuilder disjunctionBuilder = new DisjunctionBuilder(); disjunctionBuilder.add(criteria); for (int i = 0; i < basicAttRef.getKeys().size(); i++) { AttributeReference existsAttRef = basicAttRef.subReference(0, i + 1); List<AttributeReference.Key> newArg = basicAttRef.getKeys().subList(i + 1, basicAttRef.getKeys().size()); QueryCriteria plainNewBody = criteria.accept(QUERY_CRITERIA_FACTORY, newArg); QueryCriteria newBody = plainNewBody.accept(this, Collections.<AttributeReference.Key>emptyList()); disjunctionBuilder.add(new ExistsQueryCriteria(existsAttRef, newBody)); } return disjunctionBuilder.build(); }
private Query createSearchPageQuery(QueryCriteria queryCriteria, QueryManager queryManager) throws Exception { SQLQueryBuilder queryBuilder = new SQLQueryBuilder(); List<String> mopPages = this.searchPageByTitle(queryCriteria.getSiteName(), queryCriteria.getKeyword()); List<QueryProperty> queryProps = new ArrayList<QueryCriteria.QueryProperty>(); for (String page : mopPages) { QueryProperty prop = queryCriteria.new QueryProperty(); prop.setName("mop:page"); prop.setValue(page); prop.setComparisonType(COMPARISON_TYPE.EQUAL); queryProps.add(prop); } QueryProperty prop = queryCriteria.new QueryProperty(); prop.setName("exo:name"); prop.setValue("mop:" + queryCriteria.getKeyword().toLowerCase()); queryProps.add(prop); queryCriteria.setQueryMetadatas(queryProps.toArray(new QueryProperty[queryProps.size()])); mapQueryTypes(queryCriteria, queryBuilder); if (queryCriteria.isFulltextSearch()) { mapQueryPath(queryCriteria, queryBuilder); mapFulltextQueryTearm(queryCriteria, queryBuilder, LOGICAL.OR); } else { searchByNodeName(queryCriteria, queryBuilder); } mapCategoriesCondition(queryCriteria, queryBuilder); mapDatetimeRangeSelected(queryCriteria, queryBuilder); mapMetadataProperties(queryCriteria, queryBuilder, LOGICAL.OR); orderBy(queryCriteria, queryBuilder); String queryStatement = queryBuilder.createQueryStatement(); Query query = queryManager.createQuery(queryStatement, Query.SQL); return query; }
/** * Map query types. * * @param queryCriteria the query criteria * @param queryBuilder the query builder * @throws Exception the exception */ private void mapQueryTypes(final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder) throws Exception { queryBuilder.selectTypes(null); // Searh on nt:base queryBuilder.fromNodeTypes(queryCriteria.getNodeTypes()); ManageableRepository currentRepository = repositoryService.getCurrentRepository(); NodeTypeManager manager = currentRepository.getNodeTypeManager(); // Query all documents for specific content types String[] contentTypes = queryCriteria.getContentTypes(); if ((contentTypes != null && contentTypes.length > 0 && queryCriteria.getKeyword() == null) || queryCriteria.isSearchWebpage()) { mapQuerySpecificNodeTypes(queryCriteria, queryBuilder, manager); return; } List<String> selectedNodeTypes = templateService.getDocumentTemplates(); queryBuilder.openGroup(LOGICAL.AND); queryBuilder.equal("jcr:primaryType", "nt:resource", LOGICAL.NULL); // query on exo:rss-enable nodetypes for title, summary field queryBuilder.equal("jcr:mixinTypes", "exo:rss-enable", LOGICAL.OR); // query on metadata nodetype List<String> publicatioTypes = new ArrayList<String>(4); for (NodeTypeIterator iterator = manager.getAllNodeTypes(); iterator.hasNext(); ) { NodeType nodeType = iterator.nextNodeType(); if (nodeType.isNodeType("publication:webpagesPublication")) { publicatioTypes.add(nodeType.getName()); continue; } if (!nodeType.isNodeType("exo:metadata")) continue; if (nodeType.isMixin()) { queryBuilder.equal("jcr:mixinTypes", nodeType.getName(), LOGICAL.OR); } else { queryBuilder.equal("jcr:primaryType", nodeType.getName(), LOGICAL.OR); } } for (String type : selectedNodeTypes) { NodeType nodetype = manager.getNodeType(type); if (nodetype.isMixin()) { queryBuilder.like("jcr:mixinTypes", type, LOGICAL.OR); } else { queryBuilder.equal("jcr:primaryType", type, LOGICAL.OR); } } queryBuilder.closeGroup(); // unwanted document types: exo:cssFile, exo:jsFile if (excludeMimeTypes.size() < 1) return; queryBuilder.openGroup(LOGICAL.AND_NOT); String[] mimetypes = excludeMimeTypes.toArray(new String[] {}); queryBuilder.equal("jcr:mimeType", mimetypes[0], LOGICAL.NULL); for (int i = 1; i < mimetypes.length; i++) { queryBuilder.equal("jcr:mimeType", mimetypes[i], LOGICAL.OR); } queryBuilder.closeGroup(); // Unwanted document by mixin nodetypes queryBuilder.openGroup(LOGICAL.AND_NOT); queryBuilder.like("jcr:mixinTypes", "exo:cssFile", LOGICAL.NULL); queryBuilder.like("jcr:mixinTypes", "exo:jsFile", LOGICAL.OR); queryBuilder.closeGroup(); }
@Override public QueryCriteria visit(NotQueryCriteria criteria, List<AttributeReference.Key> arg) { QueryCriteria subQuery = criteria.getSubQueryCriteria().accept(this, arg); if (subQuery.equals(criteria.getSubQueryCriteria())) { return criteria; } return new NotQueryCriteria(subQuery); }
@Override public QueryCriteria visit(NotQueryCriteria criteria, Void arg) { QueryCriteria subQuery = criteria.getSubQueryCriteria().accept(this, null); if (subQuery.equals(criteria.getSubQueryCriteria())) { return criteria; } return new NotQueryCriteria(subQuery); }
@Override public QueryCriteria visit(OrQueryCriteria criteria, List<AttributeReference.Key> arg) { QueryCriteria subQuery1 = criteria.getSubQueryCriteria1().accept(this, arg); QueryCriteria subQuery2 = criteria.getSubQueryCriteria2().accept(this, arg); if (subQuery1.equals(criteria.getSubQueryCriteria1()) && subQuery2.equals(criteria.getSubQueryCriteria2())) { return criteria; } return new OrQueryCriteria(subQuery1, subQuery2); }
@Override public QueryCriteria visit(OrQueryCriteria criteria, Void arg) { QueryCriteria subQuery1 = criteria.getSubQueryCriteria1().accept(this, null); QueryCriteria subQuery2 = criteria.getSubQueryCriteria2().accept(this, null); if (subQuery1.equals(criteria.getSubQueryCriteria1()) && subQuery2.equals(criteria.getSubQueryCriteria2())) { return criteria; } return new OrQueryCriteria(subQuery1, subQuery2); }
/** * Order by. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void orderBy(final QueryCriteria criteria, final SQLQueryBuilder queryBuilder) { String sortBy = "jcr:score"; String orderBy = "desc"; // sort by if (BaseSearchServiceConnector.sortByTitle.equals(criteria.getSortBy())) { sortBy = NodetypeConstant.EXO_TITLE; } else if (BaseSearchServiceConnector.sortByDate.equals(criteria.getSortBy())) { sortBy = NodetypeConstant.EXO_LAST_MODIFIED_DATE; } if (StringUtils.isNotBlank(criteria.getOrderBy())) { orderBy = criteria.getOrderBy(); } queryBuilder.orderBy(sortBy, "desc".equals(orderBy) ? ORDERBY.DESC : ORDERBY.ASC); }
public AbstractPageList<ResultNode> searchPageContents( SessionProvider sessionProvider, QueryCriteria queryCriteria, int pageSize, boolean isSearchContent) throws Exception { ManageableRepository currentRepository = repositoryService.getCurrentRepository(); Session session = sessionProvider.getSession("portal-system", currentRepository); QueryManager queryManager = session.getWorkspace().getQueryManager(); long startTime = System.currentTimeMillis(); Query query = createSearchPageQuery(queryCriteria, queryManager); String suggestion = getSpellSuggestion(queryCriteria.getKeyword(), currentRepository); if (LOG.isDebugEnabled()) { LOG.debug("execute query: " + query.getStatement().toLowerCase()); } AbstractPageList<ResultNode> pageList = PageListFactory.createPageList( query.getStatement(), session.getWorkspace().getName(), query.getLanguage(), true, new PageNodeFilter(), new PageDataCreator(), pageSize, 0); long queryTime = System.currentTimeMillis() - startTime; pageList.setQueryTime(queryTime); pageList.setSpellSuggestion(suggestion); return pageList; }
/** * Map query specific node types. * * @param queryCriteria the query criteria * @param queryBuilder the query builder * @param nodeTypeManager the node type manager * @throws Exception the exception */ private void mapQuerySpecificNodeTypes( final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder, final NodeTypeManager nodeTypeManager) throws Exception { String[] contentTypes = queryCriteria.getContentTypes(); NodeType fistType = nodeTypeManager.getNodeType(contentTypes[0]); queryBuilder.openGroup(LOGICAL.AND); if (fistType.isMixin()) { queryBuilder.like("jcr:mixinTypes", contentTypes[0], LOGICAL.NULL); } else { queryBuilder.equal("jcr:primaryType", contentTypes[0], LOGICAL.NULL); } if (contentTypes.length > 1) { for (int i = 1; i < contentTypes.length; i++) { String type = contentTypes[i]; NodeType nodetype = nodeTypeManager.getNodeType(type); if (nodetype.isMixin()) { queryBuilder.like("jcr:mixinTypes", type, LOGICAL.OR); } else { queryBuilder.equal("jcr:primaryType", type, LOGICAL.OR); } } } queryBuilder.closeGroup(); // Remove some specific mimtype queryBuilder.openGroup(LOGICAL.AND_NOT); queryBuilder.like("jcr:mixinTypes", "exo:cssFile", LOGICAL.NULL); queryBuilder.like("jcr:mixinTypes", "exo:jsFile", LOGICAL.OR); queryBuilder.closeGroup(); }
/** * Gets the site path. * * @param queryCriteria the query criteria * @return the site path * @throws Exception the exception */ private String getSitePath(final QueryCriteria queryCriteria) throws Exception { String siteName = queryCriteria.getSiteName(); if (queryCriteria.isSearchWebpage()) { if ("all".equals(siteName) || siteName == null || siteName.trim().length() == 0) { return "/production/mop:workspace/mop:portalsites"; } return "/production/mop:workspace/mop:portalsites/mop:" + siteName; } String sitePath = null; if (siteName != null) { sitePath = livePortalManagerService.getPortalPathByName(siteName); } else { sitePath = configurationService.getLivePortalsLocation().getPath(); } return sitePath; }
protected Node getNodeToCheckState(Node node) throws Exception { Node displayNode = node; if (node.getPath().contains("web contents/site artifacts")) { return null; } if (displayNode.isNodeType("nt:resource")) { displayNode = node.getParent(); } if (displayNode.isNodeType("exo:htmlFile")) { Node parent = displayNode.getParent(); if (queryCriteria.isSearchWebContent()) { if (parent.isNodeType("exo:webContent")) return parent; return null; } if (parent.isNodeType("exo:webContent")) return null; return displayNode; } /* if(queryCriteria.isSearchWebContent()) { if(!queryCriteria.isSearchDocument()) { if(!displayNode.isNodeType("exo:webContent")) return null; } if(queryCriteria.isSearchWebpage()) { if (!displayNode.isNodeType("publication:webpagesPublication")) return null; } } else if(queryCriteria.isSearchWebpage()) { if (queryCriteria.isSearchDocument()) { return displayNode; } else if (!displayNode.isNodeType("publication:webpagesPublication")) return null; } */ String[] contentTypes = queryCriteria.getContentTypes(); if (contentTypes != null && contentTypes.length > 0) { String primaryNodeType = displayNode.getPrimaryNodeType().getName(); if (!ArrayUtils.contains(contentTypes, primaryNodeType)) return null; } return displayNode; }
/** * Map categories condition. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void mapCategoriesCondition(QueryCriteria queryCriteria, SQLQueryBuilder queryBuilder) { String[] categoryUUIDs = queryCriteria.getCategoryUUIDs(); if (categoryUUIDs == null) return; queryBuilder.openGroup(LOGICAL.AND); queryBuilder.like("exo:category", categoryUUIDs[0], LOGICAL.NULL); if (categoryUUIDs.length > 1) { for (int i = 1; i < categoryUUIDs.length; i++) { queryBuilder.like("exo:category", categoryUUIDs[i], LOGICAL.OR); } } queryBuilder.closeGroup(); }
/** * Gets the site path. * * @param queryCriteria the query criteria * @return the site path * @throws Exception the exception */ private String getPath(final QueryCriteria queryCriteria) throws Exception { String siteName = queryCriteria.getSiteName(); // search page path if (queryCriteria.isSearchWebpage()) { if ("all".equals(siteName) || siteName == null || siteName.trim().length() == 0) { return PATH_PORTAL_SITES; } return PATH_PORTAL_SITES.concat("/mop:").concat(siteName); } // search document path if (queryCriteria.getSearchPath() != null) { return queryCriteria.getSearchPath(); } String sitePath = null; if (siteName != null) { sitePath = livePortalManagerService.getPortalPathByName(siteName); } else { sitePath = configurationService.getLivePortalsLocation().getPath(); } return sitePath; }
/** * @return return the JCR path of the mop:page nodes that have gtn:name (page's title) containing * the given specified <code>keyword</code> * @throws Exception */ private List<String> searchPageByTitle(String siteName, String keyword) throws Exception { SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider(); ManageableRepository currentRepository = repositoryService.getCurrentRepository(); Session session = sessionProvider.getSession("portal-system", currentRepository); QueryManager queryManager = session.getWorkspace().getQueryManager(); QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(siteName); queryCriteria.setKeyword(keyword); queryCriteria.setSearchWebpage(true); Query query = createSearchPageByTitleQuery(queryCriteria, queryManager); if (LOG.isDebugEnabled()) { LOG.debug("execute query: " + query.getStatement().toLowerCase()); } List<String> pageList = PageListFactory.createPageList( query.getStatement(), session.getWorkspace().getName(), query.getLanguage(), true, new PageTitleDataCreator()); return pageList; }
/* * (non-Javadoc) * @see * org.exoplatform.services.wcm.search.SiteSearchService#searchSiteContents * (org.exoplatform.services.wcm.search.QueryCriteria, * org.exoplatform.services.jcr.ext.common.SessionProvider, int) */ public AbstractPageList<ResultNode> searchSiteContents( SessionProvider sessionProvider, QueryCriteria queryCriteria, int pageSize, boolean isSearchContent) throws Exception { ManageableRepository currentRepository = repositoryService.getCurrentRepository(); NodeLocation location = configurationService.getLivePortalsLocation(); Session session = sessionProvider.getSession(location.getWorkspace(), currentRepository); if (queryCriteria.isSearchWebpage()) { session = sessionProvider.getSession("portal-system", WCMCoreUtils.getRepository()); } QueryManager queryManager = session.getWorkspace().getQueryManager(); long startTime = System.currentTimeMillis(); Query query = createQuery(queryCriteria, queryManager); String suggestion = getSpellSuggestion(queryCriteria.getKeyword(), currentRepository); AbstractPageList<ResultNode> pageList = null; if (LOG.isDebugEnabled()) { LOG.debug("execute query: " + query.getStatement().toLowerCase()); } pageList = PageListFactory.createPageList( query.getStatement(), session.getWorkspace().getName(), query.getLanguage(), IdentityConstants.SYSTEM.equals(session.getUserID()), new NodeFilter(isSearchContent, queryCriteria), new DataCreator(), pageSize, 0, queryCriteria); long queryTime = System.currentTimeMillis() - startTime; pageList.setQueryTime(queryTime); pageList.setSpellSuggestion(suggestion); return pageList; }
/** * Map datetime range selected. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void mapDatetimeRangeSelected( final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder) { DATE_RANGE_SELECTED selectedDateRange = queryCriteria.getDateRangeSelected(); if (selectedDateRange == null) return; if (DATE_RANGE_SELECTED.CREATED == selectedDateRange) { DatetimeRange createdDateRange = queryCriteria.getCreatedDateRange(); queryBuilder.betweenDates( "exo:dateCreated", createdDateRange.getFromDate(), createdDateRange.getToDate(), LOGICAL.AND); } else if (DATE_RANGE_SELECTED.MODIFIDED == selectedDateRange) { DatetimeRange modifiedDateRange = queryCriteria.getLastModifiedDateRange(); queryBuilder.betweenDates( "exo:dateModified", modifiedDateRange.getFromDate(), modifiedDateRange.getToDate(), LOGICAL.AND); } else if (DATE_RANGE_SELECTED.START_PUBLICATION == selectedDateRange) { throw new UnsupportedOperationException(); } else if (DATE_RANGE_SELECTED.END_PUBLICATION == selectedDateRange) { throw new UnsupportedOperationException(); } }
/** * Search site content. * * @param queryCriteria the query criteria * @param queryManager the query manager * @return the query result * @throws Exception the exception */ private Query createQuery(QueryCriteria queryCriteria, QueryManager queryManager) throws Exception { SQLQueryBuilder queryBuilder = new SQLQueryBuilder(); mapQueryTypes(queryCriteria, queryBuilder); if (queryCriteria.isFulltextSearch()) { mapQueryPath(queryCriteria, queryBuilder); mapFulltextQueryTearm(queryCriteria, queryBuilder, LOGICAL.OR); } else { searchByNodeName(queryCriteria, queryBuilder); } mapCategoriesCondition(queryCriteria, queryBuilder); mapDatetimeRangeSelected(queryCriteria, queryBuilder); mapMetadataProperties(queryCriteria, queryBuilder, LOGICAL.AND); orderBy(queryCriteria, queryBuilder); String queryStatement = queryBuilder.createQueryStatement(); Query query = queryManager.createQuery(queryStatement, Query.SQL); return query; }
protected Node getNodeToCheckState(Node node) throws Exception { Node displayNode = node; if (displayNode.isNodeType("nt:resource")) { displayNode = node.getParent(); } // return exo:webContent when exo:htmlFile found if (displayNode.isNodeType("exo:htmlFile")) { Node parent = displayNode.getParent(); if (parent.isNodeType("exo:webContent")) return parent; return displayNode; } // String[] contentTypes = queryCriteria.getContentTypes(); if (contentTypes != null && contentTypes.length > 0) { String primaryNodeType = displayNode.getPrimaryNodeType().getName(); if (!ArrayUtils.contains(contentTypes, primaryNodeType)) return null; } return displayNode; }
@Override public Node filterNodeToDisplay(Node node) { try { Node displayNode = getNodeToCheckState(node); if (displayNode == null) return null; if (isSearchContent) return displayNode; NodeLocation nodeLocation = NodeLocation.getNodeLocationByNode(displayNode); WCMComposer wcmComposer = WCMCoreUtils.getService(WCMComposer.class); HashMap<String, String> filters = new HashMap<String, String>(); filters.put( WCMComposer.FILTER_MODE, queryCriteria.isLiveMode() ? WCMComposer.MODE_LIVE : WCMComposer.MODE_EDIT); return wcmComposer.getContent( nodeLocation.getWorkspace(), nodeLocation.getPath(), filters, WCMCoreUtils.getSystemSessionProvider()); } catch (Exception e) { return null; } }
/** * Map metadata properties. * * @param queryCriteria the query criteria * @param queryBuilder the query builder */ private void mapMetadataProperties( final QueryCriteria queryCriteria, SQLQueryBuilder queryBuilder, LOGICAL condition) { QueryProperty[] queryProperty = queryCriteria.getQueryMetadatas(); if (queryProperty == null || queryProperty.length == 0) return; queryBuilder.openGroup(condition); if (queryProperty[0].getComparisonType() == COMPARISON_TYPE.EQUAL) { queryBuilder.equal(queryProperty[0].getName(), queryProperty[0].getValue(), LOGICAL.NULL); } else { queryBuilder.like(queryProperty[0].getName(), queryProperty[0].getValue(), LOGICAL.NULL); } if (queryProperty.length > 1) { for (int i = 1; i < queryProperty.length; i++) { if (queryProperty[i].getComparisonType() == COMPARISON_TYPE.EQUAL) { queryBuilder.equal(queryProperty[i].getName(), queryProperty[i].getValue(), LOGICAL.OR); } else { queryBuilder.like(queryProperty[i].getName(), queryProperty[i].getValue(), LOGICAL.OR); } } } queryBuilder.closeGroup(); }
/** * @param queryCriteria * @param queryManager * @return * @throws Exception */ private Query createSearchPageByTitleQuery(QueryCriteria queryCriteria, QueryManager queryManager) throws Exception { SQLQueryBuilder queryBuilder = new SQLQueryBuilder(); // select * queryBuilder.selectTypes(null); // from mop:page node type queryBuilder.fromNodeTypes(new String[] {"mop:page"}); mapQueryPath(queryCriteria, queryBuilder); queryCriteria.setFulltextSearchProperty(new String[] {"gtn:name"}); mapFulltextQueryTearm(queryCriteria, queryBuilder, LOGICAL.OR); String queryStatement = queryBuilder.createQueryStatement(); Query query = queryManager.createQuery(queryStatement, Query.SQL); return query; }
public static QueryCriteria translate(QueryCriteria queryCriteria) { QueryCriteria withArrayAlternative = queryCriteria.accept(ARRAY_REFERENCE_CREATOR, null); return withArrayAlternative.accept( OR_EXISTS_CREATOR, Collections.<AttributeReference.Key>emptyList()); }
/** * Search by node name. * * @param queryCriteria the query criteria * @param queryBuilder the query builder * @throws Exception the exception */ private void searchByNodeName( final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder) throws Exception { queryBuilder.queryByNodeName(getSitePath(queryCriteria), queryCriteria.getKeyword()); }
/** * Map query types. * * @param queryCriteria the query criteria * @param queryBuilder the query builder * @throws Exception the exception */ private void mapQueryTypes(final QueryCriteria queryCriteria, final SQLQueryBuilder queryBuilder) throws Exception { queryBuilder.selectTypes(null); // Searh on nt:base queryBuilder.fromNodeTypes(queryCriteria.getNodeTypes()); ManageableRepository currentRepository = repositoryService.getCurrentRepository(); NodeTypeManager manager = currentRepository.getNodeTypeManager(); // Query all documents for specific content types String[] contentTypes = queryCriteria.getContentTypes(); if ((contentTypes != null && contentTypes.length > 0 && queryCriteria.getKeyword() == null) || queryCriteria.isSearchWebpage()) { mapQuerySpecificNodeTypes(queryCriteria, queryBuilder, manager); return; } List<String> selectedNodeTypes = (contentTypes != null && contentTypes.length > 0) ? Arrays.asList(contentTypes) : templateService.getDocumentTemplates(); queryBuilder.openGroup(LOGICAL.AND); if (selectedNodeTypes.contains("nt:file")) { queryBuilder.equal("jcr:primaryType", "nt:resource", LOGICAL.NULL); } else { // searching only document, not file. In this case, search nt:resource with // exo:webContentChild mixin queryBuilder.openGroup(null); queryBuilder.equal( NodetypeConstant.JCR_PRIMARY_TYPE, NodetypeConstant.NT_RESOURCE, LOGICAL.NULL); queryBuilder.equal( NodetypeConstant.JCR_MIXIN_TYPES, NodetypeConstant.EXO_WEBCONTENT_CHILD, LOGICAL.AND); queryBuilder.closeGroup(); } // query on exo:rss-enable nodetypes for title, summary field queryBuilder.equal("jcr:mixinTypes", "exo:rss-enable", LOGICAL.OR); for (String type : selectedNodeTypes) { NodeType nodetype = manager.getNodeType(type); if (nodetype.isMixin()) { if (selectedNodeTypes.contains("nt:file") || !NodetypeConstant.EXO_CSS_FILE.equals(type) && !NodetypeConstant.EXO_JS_FILE.equals(type) && !NodetypeConstant.EXO_HTML_FILE.equals(type)) { queryBuilder.like("jcr:mixinTypes", type, LOGICAL.OR); } else { // searching only document, not file. In this case, search nt:resource with // exo:webContentChild mixin queryBuilder.openGroup(LOGICAL.OR); queryBuilder.equal(NodetypeConstant.JCR_MIXIN_TYPES, type, LOGICAL.NULL); queryBuilder.equal( NodetypeConstant.JCR_MIXIN_TYPES, NodetypeConstant.EXO_WEBCONTENT_CHILD, LOGICAL.AND); queryBuilder.closeGroup(); } } else { queryBuilder.equal("jcr:primaryType", type, LOGICAL.OR); } } queryBuilder.closeGroup(); // unwanted document types: exo:cssFile, exo:jsFile if (excludeMimeTypes.size() < 1) return; queryBuilder.openGroup(LOGICAL.AND_NOT); String[] mimetypes = excludeMimeTypes.toArray(new String[] {}); queryBuilder.equal("jcr:mimeType", mimetypes[0], LOGICAL.NULL); for (int i = 1; i < mimetypes.length; i++) { queryBuilder.equal("jcr:mimeType", mimetypes[i], LOGICAL.OR); } queryBuilder.closeGroup(); // Unwanted document by mixin nodetypes queryBuilder.openGroup(LOGICAL.AND_NOT); queryBuilder.like("jcr:mixinTypes", "exo:cssFile", LOGICAL.NULL); queryBuilder.like("jcr:mixinTypes", "exo:jsFile", LOGICAL.OR); queryBuilder.closeGroup(); }