private boolean isProjected() { return hSearchQuery.getProjectedFields() != null; }
private QueryResultLoader getResultLoader(HSQuery hSearchQuery) { EntityLoader entityLoader = new EntityLoader(cache, keyTransformationHandler); return hSearchQuery.getProjectedFields() == null ? entityLoader : new ProjectionLoader(projectionConverter, entityLoader); }
private String toString(HSQuery query) { StringBuilder builder = new StringBuilder(); if ( StringHelper.isNotEmpty( description ) ) { builder.append( description ).append( " - " ); } builder.append( "<" ).append( query.getQueryString() ).append( ">" ) .append( " from <" ).append( query.getTargetedEntities() ).append( ">" ); String[] projected = query.getProjectedFields(); if ( projected != null && projected.length > 0 ) { builder.append( " with projections <" ).append( query.getProjectedFields() ).append( ">" ); } return builder.toString(); } }
private Loader getProjectionLoader(ObjectLoaderBuilder loaderBuilder) { ProjectionLoader loader = new ProjectionLoader(); loader.init( session, hSearchQuery.getExtendedSearchIntegrator(), resultTransformer, loaderBuilder, hSearchQuery.getProjectedFields(), hSearchQuery.getTimeoutManager(), hSearchQuery.hasThisProjection() ); return loader; }
private NodeTopDocs collectKeys(DocumentExtractor extractor, HSQuery query) { TopDocs topDocs = extractor.getTopDocs(); int topDocsLength = topDocs.scoreDocs.length; Object[] keys = null; Object[] projections = null; if (query.getProjectedFields() == null) { keys = new Object[topDocsLength]; // collecting keys (it's a eager query!) for (int i = 0; i < topDocsLength; i++) { keys[i] = extractKey(extractor, i); } } else { projections = new Object[topDocsLength]; try { for (int docIndex = 0; docIndex < topDocsLength; docIndex++) { projections[docIndex] = extractor.extract(docIndex).getProjection(); } } catch (IOException e) { throw new SearchException("Error while extracting projection", e); } } return new NodeTopDocs(cache.getRpcManager().getAddress(), topDocs, keys, projections); } }
/** * Decide which object loader to use depending on the targeted entities. If there is only a single entity targeted * a <code>QueryLoader</code> can be used which will only execute a single query to load the entities. If more than * one entity is targeted a <code>MultiClassesQueryLoader</code> must be used. We also have to consider whether * projections or <code>Criteria</code> are used. * * @return The loader instance to use to load the results of the query. */ private Loader getLoader() { ObjectLoaderBuilder loaderBuilder = new ObjectLoaderBuilder() .criteria( criteria ) .targetedEntities( hSearchQuery.getTargetedEntities() ) .indexedTargetedEntities( hSearchQuery.getIndexedTargetedEntities().toPojosSet() ) .session( session ) .searchFactory( hSearchQuery.getExtendedSearchIntegrator() ) .timeoutManager( hSearchQuery.getTimeoutManager() ) .lookupMethod( objectLookupMethod ) .retrievalMethod( databaseRetrievalMethod ); if ( hSearchQuery.getProjectedFields() != null ) { return getProjectionLoader( loaderBuilder ); } else { return loaderBuilder.buildLoader(); } }