@Transactional(readOnly=true) public class SearchBean extends AbstractStatefulBean implements Search
Search interface.iQuery, iUpdate, modified, secALLOW_LEADING_WILDCARD, DATE_TYPE_ACQUISITION, DATE_TYPE_IMPORT, DEFAULT_BATCH_SIZE, DEFAULT_CASE_SENSITIVTY, DEFAULT_MERGED_BATCHES, DEFAULT_RETURN_UNLOADED, DEFAULT_USE_PROJECTIONS, SCORE| Constructor and Description |
|---|
SearchBean()
Empty constructor required by EJB and
self configuration. |
SearchBean(Executor executor,
Class<? extends org.apache.lucene.analysis.Analyzer> analyzer) |
| Modifier and Type | Method and Description |
|---|---|
void |
activate()
Completely restore this service for active use from whatever
passivation it has implemented.
|
int |
activeQueries()
Returns the number of active queries.
|
void |
addAction(SearchAction action) |
void |
addOrderByAsc(String path)
A path from the target entity which will be added to the current stack of
order statements applied to the query.
|
void |
addOrderByDesc(String path)
A path from the target entity which will be added to the current stack of
order statements applied to the query.
|
void |
addParameters(Parameters params) |
void |
addResult(List<IObject> result) |
void |
allTypes()
Permits all types to be returned.
|
void |
and()
Applies the next by* method to the previous by* method, so that a call
Search.hasNext(), Search.next(), or Search.results() sees only
the intersection of the two calls. |
void |
byAnnotatedWith(Annotation... examples)
Finds entities annotated with an
Annotation similar to the
example. |
void |
byFullText(String query)
Passes the query as is to the Lucene backend.
|
void |
byGroupForTags(String group)
Returns transient (without ID)
TagAnnotation instances which
represent all the tags in
the given group. |
void |
byHqlQuery(String query,
Parameters p)
Delegates to
IQuery.findAllByQuery(String, Parameters) method to
take advantage of the Search.and(), Search.or(), and
Search.not() methods, or queue-semantics. |
void |
byLuceneQueryBuilder(String fields,
String from,
String to,
String dateType,
String query)
Builds a Lucene query and passes it to the Lucene backend.
|
void |
bySimilarTerms(String... terms)
Returns transient (without ID)
TextAnnotation instances which represent
terms which are similar to the given terms. |
void |
bySomeMustNone(String[] some,
String[] must,
String[] none)
Builds a Lucene query and passes it to
Search.byFullText(String). |
void |
byTagForGroups(String tag)
Creates a query which will return transient (without ID)
TagAnnotation instances which represent
all the tag groups which
the given tag belongs to. |
void |
byUUID(String[] uuids) |
void |
clearQueries()
Removes all active queries (leaving
settings
alone), such that Search.activeQueries() will return 0. |
void |
close()
signals the end of the service lifecycle.
|
Map<String,Annotation> |
currentMetadata()
Provides access to the extra query information (for example Lucene score
and boost values) for a single call to
Search.next(). |
List<Map<String,Annotation>> |
currentMetadataList()
Provides access to the extra query information (for example Lucene score
and boost values) for a single call to
Search.results(). |
<T extends IObject> |
fetchAlso(Map<T,String> fetches) |
void |
fetchAlso(String... fetches)
Adds a fetch clause for loading non-annotation fields of returned
entities.
|
void |
fetchAnnotations(Class... classes)
Queries the database for all
annotations of the given
types for all returned instances. |
int |
getBatchSize()
Returns the current batch size.
|
Class<? extends ServiceInterface> |
getServiceInterface() |
boolean |
hasNext()
Returns true if another call to
Search.next() is valid. |
boolean |
isAllowLeadingWildcard()
Returns the current leading-wildcard setting.
|
boolean |
isCaseSensitive()
Returns the current case sensitivity setting.
|
boolean |
isMergedBatches()
Returns the current merged-batches setting.
|
boolean |
isReturnUnloaded()
Returns the current return-unloaded setting.
|
boolean |
isUseProjections()
Returns the current use-projection setting.
|
void |
lastresultsAsWorkingGroup() |
IObject |
next()
Returns the next entity from the current query.
|
void |
not()
Applies the next by* method to the previous by* method, so that a call
Search.hasNext(), Search.next(), or Search.results() sees only
the intersection of the two calls. |
void |
notAnnotatedBy(Details d)
Restricts entities by who has not annotated them with an
Annotation matching the other filters. |
void |
notOwnedBy(Details d)
Uses the
Details.getOwner() and Details.getGroup()
information to restrict the entities which will be returned. |
void |
onlyAnnotatedBetween(Timestamp start,
Timestamp stop)
Restricts entities by the time in which any annotation (which matches the
other filters) was added them.
|
void |
onlyAnnotatedBy(Details d)
Restricts entities by who has annotated them with an
Annotation
matching the other filters. |
void |
onlyAnnotatedWith(Class... classes)
Restricts entities to having an
Annotation of all the given
types. |
void |
onlyCreatedBetween(Timestamp start,
Timestamp stop)
Restricts the time between which an entity may have been created.
|
void |
onlyIds(Long... ids)
Restricts the set of
ids which will be checked. |
void |
onlyModifiedBetween(Timestamp start,
Timestamp stop)
Restricts the time between which an entity may have last been modified.
|
void |
onlyOwnedBy(Details d)
Uses the
Details.getOwner() and Details.getGroup()
information to restrict the entities which will be returned. |
<T extends IObject> |
onlyType(Class<T> klass)
Restricts the search to a single type.
|
<T extends IObject> |
onlyTypes(Class<T>... classes)
Restricts searches to a set of types.
|
void |
or()
Applies the next by* method to the previous by* method, so that a call
Search.hasNext(), Search.next(), or Search.results() sees only
the union of the two calls. |
void |
passivate()
Perform whatever passivation is possible or throw an exception.
|
protected IObject |
pop(List<IObject> current)
Wrapper method which should be called on all results for the user.
|
void |
remove()
Unsupported operation.
|
void |
resetDefaults()
Resets all settings (non-query state) to the original default values, as
if the instance had just be created.
|
<T extends IObject> |
results()
Returns up to
batch size number of results along
with the related query metadata. |
void |
setAllowLeadingWildcard(boolean allowLeadingWildcard)
Permits full-text queries with a leading query if true.
|
void |
setAnalyzer(Class<? extends org.apache.lucene.analysis.Analyzer> analyzer)
Injector used by Spring.
|
void |
setBatchSize(int size)
Sets the maximum number of results that will be returned by one call to
Search.results(). |
void |
setCaseSentivice(boolean caseSensitive)
Sets the case sensitivity on all queries where case-sensitivity is
supported.
|
void |
setExecutor(Executor executor)
Injector used by Spring, currently, since
SelfConfigurableService.selfConfigure() requires it. |
void |
setIdOnly() |
void |
setMaxClauseCount(Integer maxClauseCount)
Injector used by Spring.
|
void |
setMergedBatches(boolean merge)
Set whether or not results from two separate queries can be returned in
the same call to
Search.results(). |
void |
setReturnUnloaded(boolean returnUnloaded)
Determines if all results should be returned as unloaded objects.
|
void |
setUseProjections(boolean useProjections)
Determines if Lucene queries should not hit the database.
|
void |
unordered()
Removes the current stack of order statements.
|
getBeanHelper, getCurrentEventContext, isModified, modified, selfConfigure, setQueryService, setSecuritySystem, setUpdateServiceclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitgetCurrentEventContextforEachRemainingpublic SearchBean(Executor executor, Class<? extends org.apache.lucene.analysis.Analyzer> analyzer)
public SearchBean()
self configuration.public Class<? extends ServiceInterface> getServiceInterface()
getServiceInterface in interface SelfConfigurableServicepublic void setExecutor(Executor executor)
SelfConfigurableService.selfConfigure() requires it.public void setAnalyzer(Class<? extends org.apache.lucene.analysis.Analyzer> analyzer)
public void setMaxClauseCount(Integer maxClauseCount)
@Transactional(readOnly=true) public void passivate()
StatefulServiceInterfacepassivate in interface StatefulServiceInterface@Transactional(readOnly=true) public void activate()
StatefulServiceInterfaceactivate in interface StatefulServiceInterface@Transactional(readOnly=true) public void close()
StatefulServiceInterfaceclose in interface StatefulServiceInterface@Transactional public void byAnnotatedWith(Annotation... examples)
SearchAnnotation similar to the
example. This does not use Hibernate's
Query-By-Example mechanism, since
that cannot handle joins. The fields which are used are:
OriginalFile.getId(), etc.If the main content is null it is assumed to be a wildcard searched, and only the type of the annotation is searched. Currently, ListAnnotations are not supported.
byAnnotatedWith in interface Searchexamples - Not empty.@Transactional public void byFullText(String query)
SearchbyFullText in interface Searchquery - May not be null or of zero length.@Transactional public void byLuceneQueryBuilder(String fields, String from, String to, String dateType, String query)
SearchbyLuceneQueryBuilder in interface Searchfields - The fields (comma separated) to search in (name, description, ...)from - The date range from, in the form YYYYMMDD (may be null)to - The date range to (inclusive), in the form YYYYMMDD (may be null)dateType - Search.DATE_TYPE_ACQUISITION or Search.DATE_TYPE_IMPORTquery - May not be null or of zero length.@Transactional public void byHqlQuery(String query, Parameters p)
SearchIQuery.findAllByQuery(String, Parameters) method to
take advantage of the Search.and(), Search.or(), and
Search.not() methods, or queue-semantics.byHqlQuery in interface Searchquery - Not null.p - May be null. Defaults are then in effect.IQuery.findAllByQuery(String, Parameters)@Transactional public void bySomeMustNone(String[] some, String[] must, String[] none)
SearchSearch.byFullText(String).bySomeMustNone in interface Searchsome - Some (at least one) of these terms must be present in the
document. May be null.must - All of these terms must be present in the document. May be
null.none - None of these terms may be present in the document. May be
null.@Transactional public void bySimilarTerms(String... terms)
SearchTextAnnotation instances which represent
terms which are similar to the given terms. For example, if the argument
is "cell", one return value might have as its textValue: "cellular"
while another has "cellularize".
No filtering or fetching is performed.bySimilarTerms in interface Searchterms - Cannot be empty.@Transactional public void byGroupForTags(String group)
SearchTagAnnotation instances which
represent all the tags in
the given group. The entities are transient and without ownership since
multiple users can own the same tag. This method will override settings
for types.byGroupForTags in interface Searchgroup - Can be null or empty to return all tags.@Transactional public void byTagForGroups(String tag)
SearchTagAnnotation instances which represent
all the tag groups which
the given tag belongs to. The entities are transient and without
ownership since multiple users can own the same tag group. This method
will override settings for types.byTagForGroups in interface Searchtag - Can be null or empty to return all groups.@Transactional public void byUUID(String[] uuids)
@Transactional public void or()
SearchSearch.hasNext(), Search.next(), or Search.results() sees only
the union of the two calls.
For example,
service.onlyType(Image.class);
service.byFullText("foo");
service.or();
service.onlyType(Dataset.class);
service.byFullText("foo");
will return both Images and Datasets together.
Calling this method overrides a previous setting of Search.and() or
Search.not(). If there is no active queries (i.e.
Search.activeQueries() > 0), then an ApiUsageException will be
thrown.@Transactional public void and()
SearchSearch.hasNext(), Search.next(), or Search.results() sees only
the intersection of the two calls.
For example,
service.onlyType(Image.class);
service.byFullText("foo");
service.intersection();
service.byAnnotatedWith(TagAnnotation.class);
will return only the Images with TagAnnotations.
Calling this method overrides a previous setting of Search.or() or
Search.not(). If there is no active queries (i.e.
Search.activeQueries() > 0), then an ApiUsageException will be
thrown.
@Transactional public void not()
SearchSearch.hasNext(), Search.next(), or Search.results() sees only
the intersection of the two calls.
For example,
service.onlyType(Image.class);
service.byFullText("foo");
service.complement();
service.byAnnotatedWith(TagAnnotation.class);
will return all the Images not annotated with TagAnnotation.
Calling this method overrides a previous setting of Search.or() or
Search.and(). If there is no active queries (i.e.
Search.activeQueries() > 0), then an ApiUsageException will be
thrown.
@Transactional public boolean hasNext()
SearchSearch.next() is valid. A call to
Search.next() may throw an exception for another reason, however.@Transactional public IObject next() throws ApiUsageException
SearchSearch.activeQueries() decremented.
Since this method only returns the entity itself, a single call to
Search.currentMetadata() may follow this call to gather the extra
metadata which is returned in the map via Search.results().next in interface Iterator<IObject>next in interface SearchApiUsageException - if Search.hasNext() returns false.@Transactional public Map<String,Annotation> currentMetadata()
SearchSearch.next(). This method may
only be called once for any given call to Search.next().currentMetadata in interface Search@Transactional public List<Map<String,Annotation>> currentMetadataList()
SearchSearch.results(). This method
may only be called once for any given call to Search.results().currentMetadataList in interface Search@Transactional public <T extends IObject> List<T> results()
Searchbatch size number of results along
with the related query metadata. If
batches are merged then the results from
multiple queries may be returned together.protected IObject pop(List<IObject> current)
values.@Transactional public void lastresultsAsWorkingGroup()
@Transactional public void remove() throws UnsupportedOperationException
Search@Transactional public int activeQueries()
SearchactiveQueries gives the minimum number of remaining calls
to Search.results() when batches are not
merged.activeQueries in interface Search@Transactional public void clearQueries()
Searchsettings
alone), such that Search.activeQueries() will return 0.clearQueries in interface Search@Transactional public void resetDefaults()
SearchresetDefaults in interface Search@Transactional public void addOrderByAsc(String path)
SearchaddOrderByAsc in interface Searchpath - Non-null.Search.unordered()@Transactional public void addOrderByDesc(String path)
SearchaddOrderByDesc in interface Searchpath - Non-null.Search.unordered()@Transactional public void unordered()
Searchunordered in interface SearchSearch.addOrderByAsc(String),
Search.addOrderByDesc(String)@Transactional public <T extends IObject> void fetchAlso(Map<T,String> fetches)
@Transactional public void fetchAnnotations(Class... classes)
Searchannotations of the given
types for all returned instances.fetchAnnotations in interface Searchclasses - Can be empty, which removes previous fetch setting.@Transactional public int getBatchSize()
SearchSearch.setBatchSize(int) has not
been called, the default value will be in
effect.getBatchSize in interface SearchSearch.results()Search.DEFAULT_BATCH_SIZE@Transactional public boolean isCaseSensitive()
SearchSearch.setCaseSentivice(boolean) has not been called, the
default value will be in effect.isCaseSensitive in interface Search@Transactional public boolean isMergedBatches()
SearchSearch.setMergedBatches(boolean) has not been called, the
default value will be in effect.isMergedBatches in interface Search@Transactional public void onlyAnnotatedBetween(Timestamp start, Timestamp stop)
Searchcreation event of the
Annotation.onlyAnnotatedBetween in interface Searchstart - Can be null, i.e. interval open to negative infinity.stop - Can be null, i.e. interval open to positive infinity.@Transactional public void onlyAnnotatedBy(Details d)
SearchAnnotation
matching the other filters. As Search.onlyOwnedBy(Details), the
Details.getOwner() and Details.getGroup() information is
combined with an AND condition.onlyAnnotatedBy in interface Searchd - Can be null, in which case any previous restriction is
removed.@Transactional public void notAnnotatedBy(Details d)
SearchAnnotation matching the other filters. As
Search.notOwnedBy(Details), the Details.getOwner() and
Details.getGroup() information is combined with an AND condition.notAnnotatedBy in interface Searchd - Can be null, in which case any previous restriction is
removed.@Transactional public void onlyAnnotatedWith(Class... classes)
SearchAnnotation of all the given
types. This is useful in combination with the other onlyAnnotated*
methods to say, e.g., only annotated with a file by user X. By default,
this value is null and imposes no restriction. Passing an
empty array implies an object that is not annotated at all.
Note: If the semantics were OR, then a client would have to query each
class individually, and compare all the various values, checking which
ids are where. However, since this method defaults to AND, multiple calls
(optionally with Search.isMergedBatches() and
Search.isReturnUnloaded()) and combine the results. Duplicate ids are
still possible, so a set of some form should be used to collect the
results.onlyAnnotatedWith in interface Searchclasses - Can be empty, in which case restriction is removed.@Transactional public void onlyCreatedBetween(Timestamp start, Timestamp stop)
SearchonlyCreatedBetween in interface Searchstart - Can be null, i.e. interval open to negative infinity.stop - Can be null, i.e. interval opens to positive infinity.@Transactional public void onlyOwnedBy(Details d)
SearchDetails.getOwner() and Details.getGroup()
information to restrict the entities which will be returned. If both are
non-null, the two restrictions are joined by an AND.onlyOwnedBy in interface Searchd - Can be null, in which case the previous restriction is
removed.@Transactional public void onlyIds(Long... ids)
Searchids which will be checked.
This is useful for testing one of the given restrictions on a reduced set
of objects.@Transactional public void notOwnedBy(Details d)
SearchDetails.getOwner() and Details.getGroup()
information to restrict the entities which will be returned. If both are
non-null, the two restrictions are joined by an AND.notOwnedBy in interface Searchd - Can be null, in which case the previous restriction is
removed.@Transactional public void allTypes()
Search@Transactional public <T extends IObject> void onlyType(Class<T> klass)
Search@Transactional public <T extends IObject> void onlyTypes(Class<T>... classes)
Search@Transactional public void setAllowLeadingWildcard(boolean allowLeadingWildcard)
SearchsetAllowLeadingWildcard in interface SearchSearch.isAllowLeadingWildcard(),
Search.byFullText(String),
Search.bySomeMustNone(String[], String[], String[])@Transactional public void setBatchSize(int size)
SearchSearch.results(). If batches are not merged,
then results may often be less than the batch size. If batches are
merged, then only the last call to
Search.results() can be less than batch size.
Note: some query types may not support batching at the query level, and
all instances must then be loaded into memory simultaneously.setBatchSize in interface Searchsize - maximum number of results per call to Search.results()@Transactional public void setIdOnly()
@Transactional public void setMergedBatches(boolean merge)
SearchSearch.results().setMergedBatches in interface Search@Transactional public void fetchAlso(String... fetches)
Search@Transactional public boolean isAllowLeadingWildcard()
SearchSearch.byFullText(String) and
Search.bySomeMustNone(String[], String[], String[]) will throw an
ApiUsageException, since leading-wildcard searches are quite
slow. Use Search.setAllowLeadingWildcard(boolean) in order to permit
this usage.isAllowLeadingWildcard in interface Search@Transactional public boolean isReturnUnloaded()
SearchSearch.setReturnUnloaded(boolean) has not
been called, the default value will be
in effect.isReturnUnloaded in interface Search@Transactional public boolean isUseProjections()
Searchfor more. If
Search.setUseProjections(boolean) has not been called, the
Search.DEFAULT_USE_PROJECTIONS will be in effect.isUseProjections in interface Search@Transactional public void onlyModifiedBetween(Timestamp start, Timestamp stop)
SearchonlyModifiedBetween in interface Searchstart - Can be null, i.e. interval open to negative infinity.stop - Can be null, i.e. interval open to positive infinity.@Transactional public void setCaseSentivice(boolean caseSensitive)
SearchsetCaseSentivice in interface Search@Transactional public void setReturnUnloaded(boolean returnUnloaded)
SearchIQuery. This value overrides the
Search.setUseProjections(boolean) setting.setReturnUnloaded in interface Search@Transactional public void setUseProjections(boolean useProjections)
SearchsetUseProjections in interface Searchpublic void addAction(SearchAction action)
public void addParameters(Parameters params)
Version: 5.3.3-ice35-b63
Copyright © 2017 The University of Dundee & Open Microscopy Environment. All Rights Reserved.