this.maxDoc = searcher.maxDoc();
boolean bExecuteQuery = true;
boolean bProcessHits = true;
RequestContext reqContext = this.getIndexAdapter().getRequestContext();
BooleanQuery rootQuery = new BooleanQuery();
DiscoveryFilter discoveryFilter = discoveryQuery.getFilter();
DiscoveryResult discoveryResult = discoveryQuery.getResult();
Discoverables returnables = discoveryQuery.getReturnables();
if ((returnables == null) || (returnables.size() == 0) ||
(discoveryFilter.getMaxRecords() <= 0)) {
bProcessHits = false;
}
// CSW query provider options
boolean isDublinCoreResponse = true;
boolean isBriefResponse = false;
boolean isSummaryResponse = false;
QueryOptions cswQueryOptions = (QueryOptions)reqContext.getObjectMap().get(
"com.esri.gpt.server.csw.provider.components.QueryOptions");
// build the query (if no query was supplied, we'll query everything)
LogicalClauseAdapter logicalAdapter = new LogicalClauseAdapter(this);
LogicalClause rootClause = discoveryFilter.getRootClause();
if ((rootClause == null) || (rootClause.getClauses().size() == 0)) {
if (discoveryFilter.getMaxRecords() <= QUERYALL_THRESHOLD) {
LOGGER.finer("No filter was supplied, querying all...");
logicalAdapter.appendSelectAll(rootQuery);
} else {
LOGGER.finer("No filter was supplied, query will not be executed.");
bExecuteQuery = false;
}
} else {
logicalAdapter.adaptLogicalClause(rootQuery,rootClause);
if ((rootQuery.clauses() == null) && (rootQuery.clauses().size() > 0)) {
bExecuteQuery = false;
}
}
if (!bExecuteQuery) return;
// execute the query and process the hits if required
// set the sort option
Sort sortOption = null;
if (bProcessHits && (searcher.maxDoc() > 0)) {
sortOption = makeSortOption(discoveryQuery);
}
// filters
Filter filter = null;
// make the access control filter
MetadataAcl acl = new MetadataAcl(reqContext);
AuthenticationStatus auth = reqContext.getUser().getAuthenticationStatus();
boolean bAdmin = auth.getAuthenticatedRoles().hasRole("gptAdministrator");
if (!bAdmin && !acl.isPolicyUnrestricted()) {
String[] aclValues = acl.makeUserAcl();
filter = new AclFilter(Storeables.FIELD_ACL,aclValues);
}
// isPartOf filter
filter = IsPartOfFilter.make(reqContext,filter);
// make the schema filter
if (cswQueryOptions != null) {
String schemaName = Val.chkStr(cswQueryOptions.getSchemaFilter());
if (schemaName.length() > 0) {
filter = new SchemaFilter(schemaName,filter);
isDublinCoreResponse = cswQueryOptions.isDublinCoreResponse();
if (!isDublinCoreResponse) {
String elementSetType = Val.chkStr(cswQueryOptions.getElementSetType());
if (elementSetType.equalsIgnoreCase("brief")) {
isBriefResponse = true;
} else if (elementSetType.equalsIgnoreCase("summary")) {
isSummaryResponse = true;
}
}
}
}
// determine the start/end positions
int startRecord = discoveryFilter.getStartRecord() - 1;
int maxRecords = discoveryFilter.getMaxRecords();
if (startRecord < 0) startRecord = 0;
int recordsPerPage = maxRecords;
if (recordsPerPage <= 0) recordsPerPage = 1;
int hitsToReturn = startRecord + recordsPerPage;
int nextRecord = 0;