/** * {@inheritDoc} * * @see org.eclipse.smila.search.api.SearchService#search(java.lang.String, * org.eclipse.smila.datamodel.record.Record) */ public SearchResult search(final String workflowName, final Record query) throws ProcessingException { try { final long starttime = System.nanoTime(); ensureQueryId(workflowName, query); final SearchResultImpl result = new SearchResultImpl(workflowName, query); final Blackboard blackboard = _blackboardFactory.createTransientBlackboard(); blackboard.setRecord(query); SearchMessage message = new SearchMessage(query.getId(), null); message = _processor.process(workflowName, blackboard, message); if (message.hasQuery()) { result.setQuery(blackboard.getRecord(message.getQuery())); } if (message.hasRecords()) { final Id[] ids = message.getRecords(); final Record[] records = new Record[ids.length]; for (int i = 0; i < ids.length; i++) { records[i] = blackboard.getRecord(ids[i]); } result.setRecords(records); } final long endtime = System.nanoTime(); setRuntime(blackboard, message.getQuery(), (endtime - starttime)); blackboard.invalidate(); return result; } catch (final BlackboardAccessException ex) { throw new ProcessingException("Blackboard error: ", ex); } }
/** * ensure that the given record has a "result" annotation. * * @param blackboard blackboard * @param record id of record * @return the "result" annotation on the record * @throws BlackboardAccessException error accessing blackboard. */ private Annotation ensureResultAnnotation(final Blackboard blackboard, final Id record) throws BlackboardAccessException { Annotation annotation = blackboard.getAnnotation(record, null, SearchAnnotations.RESULT); if (annotation == null) { annotation = blackboard.createAnnotation(record); blackboard.setAnnotation(record, null, SearchAnnotations.RESULT, annotation); } return annotation; }