Class FKListStore<E>

All Implemented Interfaces:
org.datanucleus.store.types.scostore.CollectionStore<E>, org.datanucleus.store.types.scostore.ListStore<E>, org.datanucleus.store.types.scostore.Store

public class FKListStore<E> extends AbstractListStore<E>
Implementation of a ListStore using foreign keys.
  • Field Details

    • updateFkStmt

      private String updateFkStmt
      Statement for updating a foreign key in a 1-N unidirectional
    • clearNullifyStmt

      private String clearNullifyStmt
    • removeAtNullifyStmt

      private String removeAtNullifyStmt
    • setStmt

      private String setStmt
    • unsetStmt

      private String unsetStmt
  • Constructor Details

    • FKListStore

      public FKListStore(org.datanucleus.metadata.AbstractMemberMetaData mmd, RDBMSStoreManager storeMgr, org.datanucleus.ClassLoaderResolver clr)
      Parameters:
      mmd - Metadata for owning field/property
      storeMgr - Manager for the datastore
      clr - ClassLoader resolver
  • Method Details

    • set

      public E set(org.datanucleus.state.DNStateManager ownerSM, int index, E element, boolean allowDependentField)
    • updateElementFk

      private boolean updateElementFk(org.datanucleus.state.DNStateManager ownerSM, Object element, Object owner, int index)
      Utility to update a foreign-key in the element in the case of a unidirectional 1-N relationship.
      Parameters:
      ownerSM - StateManager for the owner
      element - The element to update
      owner - The owner object to set in the FK
      index - The index position (or -1 if not known)
      Returns:
      Whether it was performed successfully
    • update

      public void update(org.datanucleus.state.DNStateManager ownerSM, Collection<? extends E> coll)
      Specified by:
      update in interface org.datanucleus.store.types.scostore.CollectionStore<E>
      Overrides:
      update in class AbstractCollectionStore<E>
    • internalAdd

      protected boolean internalAdd(org.datanucleus.state.DNStateManager ownerSM, int startAt, boolean atEnd, Collection<? extends E> c, int size)
      Internal method for adding item(s) to the List as a specific position.
      Specified by:
      internalAdd in class AbstractListStore<E>
      Parameters:
      ownerSM - StateManager for the owner
      startAt - The start position
      atEnd - Whether to add at the end
      c - The Collection of elements to add.
      size - Current size of list (if known). -1 if not known
      Returns:
      Whether it was successful
    • remove

      public E remove(org.datanucleus.state.DNStateManager ownerSM, int index, int size)
    • removeAll

      public boolean removeAll(org.datanucleus.state.DNStateManager ownerSM, Collection elements, int size)
    • removeAll

      public boolean removeAll(org.datanucleus.state.DNStateManager ownerSM, Collection elements, int size, int[] elementIndices)
    • internalRemove

      protected boolean internalRemove(org.datanucleus.state.DNStateManager ownerSM, Object element, int size)
      Convenience method to remove the specified element from the List.
      Specified by:
      internalRemove in class AbstractListStore<E>
      Parameters:
      ownerSM - StateManager for the owner
      element - The element
      size - Current size of list if known. -1 if not known
      Returns:
      Whether the List was modified
    • internalRemoveAt

      protected void internalRemoveAt(org.datanucleus.state.DNStateManager ownerSM, int index, int size)
      Internal method to remove an object at a location in the List. Differs from the JoinTable List in that it typically nulls out the owner FK (unless not nullable).
      Parameters:
      ownerSM - StateManager for the owner
      index - The location
      size - Current size of list (if known). -1 if not known
    • internalRemoveAtNullify

      protected void internalRemoveAtNullify(org.datanucleus.state.DNStateManager ownerSM, int index, org.datanucleus.store.connection.ManagedConnection mconn, boolean batched, boolean executeNow)
      Internal method to remove an object at a location in the List by nulling its owner and setting its List index to -1.
      Parameters:
      ownerSM - StateManager for the list owner
      index - The index to nullify
      mconn - Managed Connection to use for datastore connectivity
      batched - Whether this statement should be batched
      executeNow - Whether we should execute this statement now
    • internalRemoveAtNullifyBulk

      protected void internalRemoveAtNullifyBulk(org.datanucleus.state.DNStateManager ownerSM, int[] indices, org.datanucleus.store.connection.ManagedConnection mconn, boolean batched, boolean executeNow)
      Internal method to remove an object at a location in the List by nulling its owner and setting its List index to -1.
      Parameters:
      ownerSM - StateManager for the list owner
      indices - The indexes to nullify
      mconn - Managed Connection to use for datastore connectivity
      batched - Whether this statement should be batched
      executeNow - Whether we should execute this statement now
    • clear

      public void clear(org.datanucleus.state.DNStateManager ownerSM)
      Method to clear the List. This is called by the List.clear() method, or when the container object is being deleted and the elements are to be removed (maybe for dependent field), or also when updating a Collection and removing all existing prior to adding all new.
      Specified by:
      clear in interface org.datanucleus.store.types.scostore.CollectionStore<E>
      Overrides:
      clear in class ElementContainerStore
      Parameters:
      ownerSM - StateManager for the owner
    • validateElementForWriting

      protected boolean validateElementForWriting(org.datanucleus.state.DNStateManager ownerSM, Object element, int index)
      Method to validate that an element is valid for writing to the datastore. TODO Minimise differences to super.validateElementForWriting()
      Parameters:
      ownerSM - StateManager for the List owner
      element - The element to validate
      index - The position that the element is being stored at in the list
      Returns:
      Whether the element was inserted
    • listIterator

      protected ListIterator<E> listIterator(org.datanucleus.state.DNStateManager ownerSM, int startIdx, int endIdx)
      Accessor for an iterator through the list elements.
      Specified by:
      listIterator in class AbstractListStore<E>
      Parameters:
      ownerSM - StateManager for the owner.
      startIdx - The start index in the list (only for indexed lists)
      endIdx - The end index in the list (only for indexed lists)
      Returns:
      The List Iterator
    • getUpdateFkStmt

      private String getUpdateFkStmt(Object element)
      Generate statement for updating the owner, index columns in an inverse 1-N. Will result in the statement
       UPDATE ELEMENTTABLE SET FK_COL_1 = ?, FK_COL_2 = ?, FK_IDX = ? [,DISTINGUISHER=?]
       WHERE ELEMENT_ID = ?
       
      when we have a single element table, and
       UPDATE ? SET FK_COL_1=?, FK_COL_2=?, FK_IDX=? [,DISTINGUISHER=?]
       WHERE ELEMENT_ID=?
       
      when we have multiple element tables possible
      Returns:
      Statement for updating the owner/index of an element in an inverse 1-N
    • getUpdateFkStatementString

      private String getUpdateFkStatementString(Object element)
    • getClearNullifyStmt

      private String getClearNullifyStmt()
      Generates the statement for clearing items by nulling the owner link out. The statement will be
       UPDATE LISTTABLE SET OWNERCOL=NULL, INDEXCOL=-1 [,DISTINGUISHER=NULL]
       WHERE OWNERCOL=? [AND DISTINGUISHER=?]
       
      when there is only one element table, and will be
       UPDATE ? SET OWNERCOL=NULL, INDEXCOL=-1 [,DISTINGUISHER=NULL]
       WHERE OWNERCOL=? [AND DISTINGUISHER=?]
       
      when there is more than 1 element table.
      Returns:
      The Statement for clearing items for the owner.
    • getSetStmt

      private String getSetStmt(Object element)
      Generates the statement for setting an item to be at a position.
       UPDATE LISTTABLE SET OWNERCOL=?, INDEXCOL = ? [,DISTINGUISHER=?]
       WHERE ELEMENTCOL = ?
       
      Parameters:
      element - The element to set
      Returns:
      The Statement for setting an item
    • getSetStatementString

      private String getSetStatementString(Object element)
    • getUnsetStmt

      private String getUnsetStmt()
      Generates the statement for unsetting an item from a list position.
       UPDATE LISTTABLE SET OWNERCOL=NULL, INDEXCOL=-1 [, DISTINGUISHER = NULL]
       WHERE OWNERCOL = ? AND INDEXCOL = ? [AND DISTINGUISHER = ?]
       
      Returns:
      The Statement for unsetting an item
    • getRemoveAtNullifyStmt

      private String getRemoveAtNullifyStmt()
      Generates the statement for removing an item by nulling it out (setting owner to null, and index to -1). When there is only a single element table the statement will be
       UPDATE LISTTABLE SET OWNERCOL=NULL, INDEXCOL=-1
       WHERE OWNERCOL = ?
       AND INDEXCOL = ?
       [AND DISTINGUISHER = ?]
       
      Returns:
      The Statement for removing an item from a position
    • getRemoveAtNullifyBulkStmt

      private String getRemoveAtNullifyBulkStmt(int[] indices)
      Generates the statement for removing an item by nulling it out (setting owner to null, and index to -1). When there is only a single element table the statement will be
       UPDATE LISTTABLE SET OWNERCOL=NULL, INDEXCOL=-1
       WHERE (OWNERCOL=? AND INDEXCOL=? [AND DISTINGUISHER=?]) OR (OWNERCOL=? AND INDEXCOL=? [AND DISTINGUISHER=?]) OR ...
       
      Parameters:
      indices - The indexes to nullify at (only uses the length of the array)
      Returns:
      The Statement for removing an item from a position
    • getIteratorStatement

      public ElementIteratorStatement getIteratorStatement(org.datanucleus.ExecutionContext ec, org.datanucleus.FetchPlan fp, boolean addRestrictionOnOwner, int startIdx, int endIdx)
      Method to return the SQLStatement and mapping for an iterator for this backing store. Create a statement of the form
       SELECT ELEM_COLS
       FROM ELEM_TBL
       [WHERE]
         [ELEM_TBL.OWNER_ID = {value}] [AND]
         [ELEM_TBL.DISCRIM = {discrimValue}]
       [ORDER BY {orderClause}]
       
      This is public to provide access for BulkFetchXXXHandler class(es).
      Parameters:
      ec - ExecutionContext
      fp - FetchPlan to use in determing which fields of element to select
      addRestrictionOnOwner - Whether to restrict to a particular owner (otherwise functions as bulk fetch for many owners).
      startIdx - Start index for the iterator (or -1)
      endIdx - End index for the iterator (or -1)
      Returns:
      The SQLStatement and its associated StatementClassMapping