- delete this_query;
- if (m_client->m_last_resultCount > *sr->smallSetUpperBound &&
- m_client->m_last_resultCount < *sr->largeSetLowerBound)
- {
- Z_NamePlusRecordList *npr;
- int toget = *sr->mediumSetPresentNumber;
- Z_RecordComposition *comp = 0;
-
- if (toget > m_client->m_last_resultCount)
- toget = m_client->m_last_resultCount;
-
- if (sr->mediumSetElementSetNames)
- {
- comp = (Z_RecordComposition *)
- odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
- comp->which = Z_RecordComp_simple;
- comp->u.simple = sr->mediumSetElementSetNames;
- }
-
- if (m_client->m_cache.lookup (odr_encode(), &npr, 1, toget,
- sr->preferredRecordSyntax, comp))
- {
- yaz_log (YLOG_LOG, "%sReturned cached records for medium set",
- m_session_str);
- Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
- new_apdu->u.searchResponse->referenceId = sr->referenceId;
- new_apdu->u.searchResponse->resultCount =
- &m_client->m_last_resultCount;
-
- new_apdu->u.searchResponse->numberOfRecordsReturned
- = odr_intdup(odr_encode(), toget);
-
- new_apdu->u.searchResponse->presentStatus =
- odr_intdup(odr_encode(), Z_PresentStatus_success);
- new_apdu->u.searchResponse->records = (Z_Records*)
- odr_malloc(odr_encode(), sizeof(Z_Records));
- new_apdu->u.searchResponse->records->which = Z_Records_DBOSD;
- new_apdu->u.searchResponse->records->u.databaseOrSurDiagnostics = npr;
- new_apdu->u.searchResponse->nextResultSetPosition =
- odr_intdup(odr_encode(), toget+1);
- send_to_client(new_apdu);
- return 0;
- }
- else
- {
- // medium Set
- // send present request (medium size)
- yaz_log (YLOG_LOG, "%sOptimizing search for medium set",
- m_session_str);
-
- Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentRequest);
- Z_PresentRequest *pr = new_apdu->u.presentRequest;
- pr->referenceId = sr->referenceId;
- pr->resultSetId = sr->resultSetName;
- pr->preferredRecordSyntax = sr->preferredRecordSyntax;
- *pr->numberOfRecordsRequested = toget;
- pr->recordComposition = comp;
- m_client->m_sr_transform = 1;
- return new_apdu;
- }
- }
- else if (m_client->m_last_resultCount >= *sr->largeSetLowerBound ||
- m_client->m_last_resultCount <= 0)
- {
- // large set. Return pseudo-search response immediately
- yaz_log (YLOG_LOG, "%sOptimizing search for large set",
- m_session_str);
- Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
- new_apdu->u.searchResponse->referenceId = sr->referenceId;
- new_apdu->u.searchResponse->resultCount =
- &m_client->m_last_resultCount;
- send_to_client(new_apdu);
- return 0;
- }
- else
- {
- Z_NamePlusRecordList *npr;
- int toget = m_client->m_last_resultCount;
- Z_RecordComposition *comp = 0;
- // small set
- // send a present request (small set)
-
- if (sr->smallSetElementSetNames)
- {
- comp = (Z_RecordComposition *)
- odr_malloc(odr_encode(), sizeof(Z_RecordComposition));
- comp->which = Z_RecordComp_simple;
- comp->u.simple = sr->smallSetElementSetNames;
- }
-
- if (m_client->m_cache.lookup (odr_encode(), &npr, 1, toget,
- sr->preferredRecordSyntax, comp))
- {
- yaz_log (YLOG_LOG, "%sReturned cached records for small set",
- m_session_str);
- Z_APDU *new_apdu = create_Z_PDU(Z_APDU_searchResponse);
- new_apdu->u.searchResponse->referenceId = sr->referenceId;
- new_apdu->u.searchResponse->resultCount =
- &m_client->m_last_resultCount;
-
- new_apdu->u.searchResponse->numberOfRecordsReturned
- = odr_intdup(odr_encode(), toget);
-
- new_apdu->u.searchResponse->presentStatus =
- odr_intdup(odr_encode(), Z_PresentStatus_success);
- new_apdu->u.searchResponse->records = (Z_Records*)
- odr_malloc(odr_encode(), sizeof(Z_Records));
- new_apdu->u.searchResponse->records->which = Z_Records_DBOSD;
- new_apdu->u.searchResponse->records->u.databaseOrSurDiagnostics = npr;
- new_apdu->u.searchResponse->nextResultSetPosition =
- odr_intdup(odr_encode(), toget+1);
- send_to_client(new_apdu);
- return 0;
- }
- else
- {
- yaz_log (YLOG_LOG, "%sOptimizing search for small set",
- m_session_str);
- Z_APDU *new_apdu = create_Z_PDU(Z_APDU_presentRequest);
- Z_PresentRequest *pr = new_apdu->u.presentRequest;
- pr->referenceId = sr->referenceId;
- pr->resultSetId = sr->resultSetName;
- pr->preferredRecordSyntax = sr->preferredRecordSyntax;
- *pr->numberOfRecordsRequested = toget;
- pr->recordComposition = comp;
- m_client->m_sr_transform = 1;
- return new_apdu;
- }
- }
- }
- else // query doesn't match
- {
- delete m_client->m_last_query;
- m_client->m_last_query = this_query;
- m_client->m_last_ok = 0;
- m_client->m_cache.clear();
- m_client->m_resultSetStartPoint = 0;