T
- Type of link objectL
- type of left endR
- type of right endpublic abstract class LinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject> extends IndexedLinkManager<T,L,R>
LinkManager
class calls these the Link
DataObjects are pseudo inner classes of the LinkManager
Often the Link objects will remain hidden inside the LinkManager
sub-class and only be
manipulated via an external interface. If we want to track the history of a Link object needs a status
field that marks if the link is valid. This way the same object is used to record the link between two peer objects
even if the link is broken and remade several times. Link
can be selected based on the objects at the
end on the link. e.g.
// get a link
Link l = manager.getLink(left_peer,right_peer); // null if link does not exist
// or
Link l2 = manager.makeLink(left_peer,right_peer); // make link if it does not already exist
LinkManager can navigate the links in either direction the subclass may
choose only to expose one direction of navigation. Internally this is implemented using the
LinkFilter
or SQLLinkFilter
classes which select a set a Link
objects
based on the value of one or other end.
// links joining left_peer to something
Iterator<Link> it = manager.getLinkIterator(left_peer,null,filter);
// or go straight to the referenced object
Iterator<Right> right_it = manager.getRightIterator(left_peer,null,filter);
The Link class can cache references to the objects it points to, these cached values are retrieved using
the getLeft()
and getRight()
methods.
LinkManager provides a single point in the code to optionally apply SQL join optimisations. A SQL join can be used to initialise the cache fields in the Link object when it is created.
Modifier and Type | Class and Description |
---|---|
class |
LinkManager.JoinLinkFilterIterator
Version of FilterIterator that optimises the end object caches by
performing a join on target tables.
|
class |
LinkManager.JoinLinkMapper
A
ResultMapper that handles setting the links from joins. |
class |
LinkManager.LeftAcceptFilter
A wrapper to convert a non SQL filter on the link object into an
AcceptFilter
on the left object |
static class |
LinkManager.Link<L extends DataObject,R extends DataObject>
Link is an object representing an entry in a linkage table.
|
class |
LinkManager.LinkInput
An input for Link objects implemented as a CompositeInput
|
class |
LinkManager.LinkResult
A
FilterResult for link objects. |
class |
LinkManager.RightAcceptFilter
A wrapper to convert a non SQL filter on the link object into an
AcceptFilter
on the right object |
IndexedLinkManager.LinkFilter, IndexedLinkManager.LinkProvider<T extends IndexedLinkManager.Link<L,R>,L extends Indexed,R extends Indexed>, IndexedLinkManager.LinkUpdater, IndexedLinkManager.SQLLinkFilter
DataObjectFactory.AbstractDataObjectInput, DataObjectFactory.AbstractFinder<X>, DataObjectFactory.DataObjectAcceptFilter, DataObjectFactory.DataObjectInput, DataObjectFactory.DataObjectIntegerInput, DataObjectFactory.DestAcceptFilter<T extends DataObject>, DataObjectFactory.FilterAdapter, DataObjectFactory.FilterCounter, DataObjectFactory.FilterExists, DataObjectFactory.FilterIterator, DataObjectFactory.FilterSelector, DataObjectFactory.FilterSet, DataObjectFactory.Finder, DataObjectFactory.MakeRemoteFilterVisitor<R extends DataObject>, DataObjectFactory.MatchFilter, DataObjectFactory.ReferencedAdapter<I extends Indexed>, DataObjectFactory.ReferenceIterator<I extends Indexed>, DataObjectFactory.SortingDataObjectInput, DataObjectFactory.TimeAcceptFilter<T extends DataObject>, DataObjectFactory.TimeFilter
Modifier and Type | Field and Description |
---|---|
static Feature |
USE_JOIN |
AUTO_CREATE_TABLES_FEATURE, COMPOSITES_SUFFIX, REJECT_MULTIPLE_RESULT_FEATURE, res
Modifier | Constructor and Description |
---|---|
protected |
LinkManager() |
protected |
LinkManager(AppContext c,
java.lang.String table,
DataObjectFactory<L> left_fac,
java.lang.String left_field,
DataObjectFactory<R> right_fac,
java.lang.String right_field) |
Modifier and Type | Method and Description |
---|---|
T |
find(L l,
R r,
BaseFilter<T> f) |
T |
find(L l,
R r,
BaseFilter<T> f,
boolean allow_null) |
protected TableSpecification |
getDefaultTableSpecification(AppContext c,
java.lang.String table,
IndexedProducer<L> leftFac,
java.lang.String leftField,
IndexedProducer<R> rightFac,
java.lang.String rightField) |
BaseFilter<T> |
getFilter(L left,
R right,
BaseFilter<T> fil) |
FilterResult<T> |
getFilterResult(L left,
R right,
BaseFilter<T> fil)
get A
FilterResult for link objects |
DataObjectItemInput<T> |
getInput()
get the default
Input for this Factory
Default behaviour is to use the DataObjectFactory.getSelectFilter() method to generate a DataObjectFactory.DataObjectInput
but not to restrict the parse values (default value of DataObjectFactory.restrictDefaultInput() so existing values that don't
match the select filter are still valid. |
DataObjectFactory<L> |
getLeftFactory() |
BaseFilter<L> |
getLeftFilter(BaseFilter<T> fil)
Get a filter for the left peer from a filter on the link
|
SQLFilter<L> |
getLeftFilter(SQLFilter<T> fil)
Get a filter for the left peer from a filter on the link
|
protected DataObjectItemInput<L> |
getLeftInput() |
SQLFilter<T> |
getLeftJoinFilter(SQLFilter<L> fil)
|
BaseFilter<T> |
getLeftRemoteFilter(BaseFilter<L> fil)
get a
BaseFilter for the link from a BaseFilter on the left peer |
long |
getLinkCount(L l,
R r,
BaseFilter<T> f) |
CloseableIterator<T> |
getLinkIterator(L l,
R r,
BaseFilter<T> f,
boolean use_join) |
DataObjectFactory<R> |
getRightFactory() |
BaseFilter<R> |
getRightFilter(BaseFilter<T> fil)
Get a filter for the right peer from a filter on the link.
|
SQLFilter<R> |
getRightFilter(SQLFilter<T> fil)
|
protected DataObjectItemInput<R> |
getRightInput() |
SQLFilter<T> |
getRightJoinFilter(SQLFilter<R> fil)
|
BaseFilter<T> |
getRightRemoteFilter(BaseFilter<R> fil)
get a
BaseFilter for the link from a BaseFilter on the right peer. |
protected java.util.Map<java.lang.String,Selector> |
getSelectors()
Get a Map of selectors to use for forms of this type.
|
java.lang.Class<T> |
getTarget()
Get a bound on the type of object produced by this factory for run-time checking.
|
protected boolean |
isLeft(java.lang.Object o) |
protected boolean |
isRight(java.lang.Object o) |
addLeftSet, addRightSet, getDefaultTableSpecification, getFinalTableSpecification, getFormUpdate, getHistoryHandler, getLeftField, getLeftFilter, getLeftProducer, getLeftSet, getLink, getRightField, getRightFilter, getRightProducer, getRightSet, getTableSpecification, makeHistoryHandler, makeLink, modifyHistoryTable, selectLink, setContext, setHistoryHandler, updateHistory, useAutoHistory
all, allowPreSelect, canCreate, canUpdate, checkComposite, convertToDestinationFilter, customiseForm, equals, exists, find, find, find, find, find, getAllIterator, getComposite, getComposites, getComposites, getConfigTag, getContext, getCount, getDefaultRelationshipFilter, getDefaults, getDestFilter, getExcludeFilter, getFieldConstraints, getFieldHelp, getFilter, getFilter, getFilter, getFinalSelectFilter, getFinalTableSpecification, getFindFilter, getFormCreator, getID, getIndex, getInput, getInput, getLogger, getMaxIdentifierLength, getNullable, getOptional, getOrder, getProperty, getReferenced, getReferenceFieldType, getReferenceFieldType, getRemoteFilter, getRemoteSQLFilter, getResult, getResult, getSelectFilter, getSelector, getSelector, getSupress, getTableStructureContributers, getTag, getTranslations, getUniqueIdName, hasComposite, hashCode, isMine, isMine, isMyReference, isValid, makeBDO, makeBDO, makeObject, makeRecord, makeReference, makeReference, matches, narrowSelector, narrowSelector, observeComposite, OrderBy, postCreateTableSetup, postSetContext, release, restrictDefaultInput, setComposites, setContext, setContext, setContextWithMake, setProperty, toString, updateTable
public static final Feature USE_JOIN
protected LinkManager(AppContext c, java.lang.String table, DataObjectFactory<L> left_fac, java.lang.String left_field, DataObjectFactory<R> right_fac, java.lang.String right_field)
protected LinkManager()
protected TableSpecification getDefaultTableSpecification(AppContext c, java.lang.String table, IndexedProducer<L> leftFac, java.lang.String leftField, IndexedProducer<R> rightFac, java.lang.String rightField)
getDefaultTableSpecification
in class IndexedLinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject>
public DataObjectItemInput<T> getInput()
DataObjectFactory
Input
for this Factory
Default behaviour is to use the DataObjectFactory.getSelectFilter()
method to generate a DataObjectFactory.DataObjectInput
but not to restrict the parse values (default value of DataObjectFactory.restrictDefaultInput()
so existing values that don't
match the select filter are still valid.getInput
in interface Selector<DataObjectItemInput<T extends LinkManager.Link<L,R>>>
getInput
in class DataObjectFactory<T extends LinkManager.Link<L,R>>
public DataObjectFactory<L> getLeftFactory()
public CloseableIterator<T> getLinkIterator(L l, R r, BaseFilter<T> f, boolean use_join) throws DataFault
DataFault
public long getLinkCount(L l, R r, BaseFilter<T> f) throws DataException
DataException
public T find(L l, R r, BaseFilter<T> f) throws DataException
DataException
public T find(L l, R r, BaseFilter<T> f, boolean allow_null) throws DataException
DataException
public DataObjectFactory<R> getRightFactory()
public FilterResult<T> getFilterResult(L left, R right, BaseFilter<T> fil) throws DataFault
FilterResult
for link objectsgetFilterResult
in class IndexedLinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject>
left
- Left DataObject
required null for anyright
- Right DataObject
requeired null for anyfil
- Additional BaseFilter
FilterResult
DataFault
public BaseFilter<T> getFilter(L left, R right, BaseFilter<T> fil)
public java.lang.Class<T> getTarget()
DataObjectFactory
IndexedProducer.getTarget()
. Normally this method should be overridden
each time we make a sub-class that narrows the produced type. However
checks should still pass if the super-type method is retained.getTarget
in interface IndexedProducer<T extends LinkManager.Link<L,R>>
getTarget
in interface Targetted<T extends LinkManager.Link<L,R>>
getTarget
in class IndexedLinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject>
public BaseFilter<L> getLeftFilter(BaseFilter<T> fil)
fil
- SQLFilter on selfpublic SQLFilter<L> getLeftFilter(SQLFilter<T> fil)
fil
- SQLFilter on selfpublic SQLFilter<T> getLeftJoinFilter(SQLFilter<L> fil)
fil
- SQLFilter on left peerpublic BaseFilter<T> getLeftRemoteFilter(BaseFilter<L> fil)
BaseFilter
for the link from a BaseFilter
on the left peerfil
- BaseFilter
on left peerBaseFilter
on selfpublic BaseFilter<R> getRightFilter(BaseFilter<T> fil)
fil
- SQLFilter on selfpublic SQLFilter<R> getRightFilter(SQLFilter<T> fil)
fil
- SQLFilter on selfpublic BaseFilter<T> getRightRemoteFilter(BaseFilter<R> fil)
BaseFilter
for the link from a BaseFilter
on the right peer.fil
- BaseFilter
in right peerBaseFilter
on selfprotected boolean isLeft(java.lang.Object o)
isLeft
in class IndexedLinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject>
protected boolean isRight(java.lang.Object o)
isRight
in class IndexedLinkManager<T extends LinkManager.Link<L,R>,L extends DataObject,R extends DataObject>
protected DataObjectItemInput<L> getLeftInput()
protected DataObjectItemInput<R> getRightInput()
protected java.util.Map<java.lang.String,Selector> getSelectors()
DataObjectFactory
getSelectors
in class DataObjectFactory<T extends LinkManager.Link<L,R>>
DataObjectFormFactory