Class AbstractListStore<E>

All Implemented Interfaces:
org.datanucleus.store.types.scostore.CollectionStore<E>, org.datanucleus.store.types.scostore.ListStore<E>, org.datanucleus.store.types.scostore.Store
Direct Known Subclasses:
FKListStore, JoinListStore

public abstract class AbstractListStore<E> extends AbstractCollectionStore<E> implements org.datanucleus.store.types.scostore.ListStore<E>
Abstract representation of a backing store for a List.
  • Field Details

    • indexedList

      protected boolean indexedList
      Whether the list is indexed. If false then it will have no orderMapping.
    • indexOfStmt

      protected String indexOfStmt
    • lastIndexOfStmt

      protected String lastIndexOfStmt
    • removeAtStmt

      protected String removeAtStmt
    • shiftStmt

      protected String shiftStmt
    • shiftBulkStmt

      protected String shiftBulkStmt
  • Constructor Details

    • AbstractListStore

      protected AbstractListStore(RDBMSStoreManager storeMgr, org.datanucleus.ClassLoaderResolver clr)
      Constructor. Protected to prevent instantiation.
      Parameters:
      storeMgr - Manager for the store
      clr - ClassLoader resolver
  • Method Details

    • iterator

      public Iterator<E> iterator(org.datanucleus.state.DNStateManager ownerSM)
      Description copied from class: ElementContainerStore
      Accessor for an iterator through the container elements.
      Specified by:
      iterator in interface org.datanucleus.store.types.scostore.CollectionStore<E>
      Specified by:
      iterator in class ElementContainerStore
      Parameters:
      ownerSM - StateManager for the container.
      Returns:
      The Iterator
    • listIterator

      public ListIterator<E> listIterator(org.datanucleus.state.DNStateManager ownerSM)
      Specified by:
      listIterator in interface org.datanucleus.store.types.scostore.ListStore<E>
    • listIterator

      protected abstract ListIterator<E> listIterator(org.datanucleus.state.DNStateManager ownerSM, int startIdx, int endIdx)
      Accessor for an iterator through the list elements.
      Parameters:
      ownerSM - StateManager for the container.
      startIdx - The start point in the list (only for indexed lists).
      endIdx - The end point in the list (only for indexed lists).
      Returns:
      The List Iterator
    • add

      public boolean add(org.datanucleus.state.DNStateManager ownerSM, E element, int size)
      Specified by:
      add in interface org.datanucleus.store.types.scostore.CollectionStore<E>
    • add

      public void add(org.datanucleus.state.DNStateManager ownerSM, E element, int index, int size)
      Specified by:
      add in interface org.datanucleus.store.types.scostore.ListStore<E>
    • addAll

      public boolean addAll(org.datanucleus.state.DNStateManager ownerSM, Collection<? extends E> elements, int size)
      Specified by:
      addAll in interface org.datanucleus.store.types.scostore.CollectionStore<E>
    • addAll

      public boolean addAll(org.datanucleus.state.DNStateManager ownerSM, Collection<? extends E> elements, int index, int size)
      Specified by:
      addAll in interface org.datanucleus.store.types.scostore.ListStore<E>
    • internalAdd

      protected abstract boolean internalAdd(org.datanucleus.state.DNStateManager ownerSM, int startAt, boolean atEnd, Collection<? extends E> elements, int size)
      Internal method for adding an item to the List.
      Parameters:
      ownerSM - StateManager
      startAt - The start position
      atEnd - Whether to add at the end
      elements - The Collection of elements to add.
      size - Current size of List (if known). -1 if not known
      Returns:
      Whether it was successful
    • get

      public E get(org.datanucleus.state.DNStateManager ownerSM, int index)
      Specified by:
      get in interface org.datanucleus.store.types.scostore.ListStore<E>
    • indexOf

      public int indexOf(org.datanucleus.state.DNStateManager ownerSM, Object element)
      Specified by:
      indexOf in interface org.datanucleus.store.types.scostore.ListStore<E>
    • lastIndexOf

      public int lastIndexOf(org.datanucleus.state.DNStateManager ownerSM, Object element)
      Specified by:
      lastIndexOf in interface org.datanucleus.store.types.scostore.ListStore<E>
    • remove

      public boolean remove(org.datanucleus.state.DNStateManager ownerSM, Object element, int size, boolean allowDependentField)
      Specified by:
      remove in interface org.datanucleus.store.types.scostore.CollectionStore<E>
    • internalRemove

      protected abstract boolean internalRemove(org.datanucleus.state.DNStateManager ownerSM, Object element, int size)
      Internal method to remove the specified element from the List.
      Parameters:
      ownerSM - StateManager of the owner
      element - The element
      size - Current size of list if known. -1 if not known
      Returns:
      Whether the List was modified
    • subList

      public List<E> subList(org.datanucleus.state.DNStateManager sm, int startIdx, int endIdx)
      Specified by:
      subList in interface org.datanucleus.store.types.scostore.ListStore<E>
    • getIndicesOf

      protected int[] getIndicesOf(org.datanucleus.state.DNStateManager ownerSM, Collection elements)
      Utility to find the indices of a collection of elements. The returned list are in reverse order (highest index first).
      Parameters:
      ownerSM - StateManager
      elements - The elements
      Returns:
      The indices of the elements in the List.
    • internalIndexOf

      protected int internalIndexOf(org.datanucleus.state.DNStateManager ownerSM, Object element, String stmt)
      Internal method to find the index of an element.
      Parameters:
      ownerSM - StateManager
      element - The element
      stmt - The statement to find the element.
      Returns:
      The index of the element in the List.
    • internalRemoveAt

      protected void internalRemoveAt(org.datanucleus.state.DNStateManager ownerSM, int index, String stmt, int size)
      Internal method to remove an object at a location in the List.
      Parameters:
      ownerSM - StateManager for the list owner
      index - The location
      stmt - The statement to remove the element from the List
      size - Current list size (if known). -1 if not known
    • internalShiftBulk

      protected int[] internalShiftBulk(org.datanucleus.state.DNStateManager ownerSM, int start, int amount, org.datanucleus.store.connection.ManagedConnection conn, boolean batched, boolean executeNow)
      Method to process a "shift" statement for all rows from the start point, updating the index in the list for the specified owner.
      Parameters:
      ownerSM - StateManager for the list owner
      start - The start index for the shift
      amount - Amount to shift by (negative means shift down)
      conn - The connection
      batched - Whether the statement is batched
      executeNow - Whether to execute the statement now (or wait for batching)
      Returns:
      Return code(s) from any executed statements
      Throws:
      org.datanucleus.exceptions.NucleusDataStoreException - Thrown if an error occurs
    • internalShift

      protected int[] internalShift(org.datanucleus.state.DNStateManager ownerSM, int oldIndex, int amount, org.datanucleus.store.connection.ManagedConnection conn, boolean batched, boolean executeNow)
      Method to process a "shift" statement, updating the index in the list of the specified index.
      Parameters:
      ownerSM - StateManager for the list owner
      oldIndex - The old index
      amount - Amount to shift by (negative means shift down)
      conn - The connection
      batched - Whether the statement is batched
      executeNow - Whether to execute the statement now (or wait for batching)
      Returns:
      Return code(s) from any executed statements
      Throws:
      org.datanucleus.exceptions.NucleusDataStoreException - Thrown if an error occurs
    • getIndexOfStmt

      protected String getIndexOfStmt(Object element)
      Generate statement for getting the index of an item.
       SELECT INDEXCOL FROM LISTTABLE
       WHERE OWNERCOL=?
       AND ELEMENTCOL=?
       [AND EMBEDDEDFIELD1=? AND EMBEDDEDFIELD2=? AND ...]
       [AND DISTINGUISHER=?]
       ORDER BY INDEXCOL
       
      Parameters:
      element - The element to get the index of
      Returns:
      The Statement for getting the index of an item
    • getIndexOfStatementString

      private String getIndexOfStatementString(Object element)
    • getLastIndexOfStmt

      protected String getLastIndexOfStmt(Object element)
      Generates the statement for getting the index of the last item.
       SELECT INDEXCOL FROM LISTTABLE
       WHERE OWNERCOL=?
       AND ELEMENTCOL=?
       [AND EMBEDDEDFIELD1=? AND EMBEDDEDFIELD2=? AND ...]
       [AND DISTINGUISHER=?]
       ORDER BY INDEXCOL DESC
       
      Parameters:
      element - The element to get index of
      Returns:
      The Statement for getting the last item
    • getLastIndexOfStatementString

      private String getLastIndexOfStatementString(Object element)
    • getIndicesOfStmt

      protected String getIndicesOfStmt(Collection elements)
      Generates the statement for getting the indices of a collection of element. Order into descending index order (highest first) so they will NOT be in the same order as they appear in the input collection "elements".
       SELECT INDEXCOL FROM LISTTABLE
       WHERE (OWNERCOL=? AND ELEMENT_COL=? [AND DISTINGUISHER=?]) OR
             (OWNERCOL=? AND ELEMENT_COL=? [AND DISTINGUISHER=?]) OR
             (OWNERCOL=? AND ELEMENT_COL=? [AND DISTINGUISHER=?])
       ORDER BY INDEXCOL DESC
       
      Parameters:
      elements - The elements to retrieve the indices for.
      Returns:
      The Statement for getting the indices of the collection.
    • getRemoveAtStmt

      protected String getRemoveAtStmt()
      Generates the statement for removing an item.
       DELETE FROM LISTTABLE
       WHERE OWNERCOL = ?
       AND INDEXCOL = ?
       [AND DISTINGUISHER=?]
       
      Returns:
      The Statement for removing an item from a position
    • getShiftStmt

      protected String getShiftStmt()
      Generates the statement for shifting items.
       UPDATE LISTTABLE SET INDEXCOL = ? + INDEXCOL
       WHERE OWNERCOL = ?
       AND INDEXCOL = ?
       [AND DISTINGUISHER=?]
       
      Returns:
      The Statement for shifting elements
    • getShiftBulkStmt

      protected String getShiftBulkStmt()
      Generates the statement for shifting items in bulk.
       UPDATE LISTTABLE SET INDEXCOL = INDEXCOL + ?
       WHERE OWNERCOL = ?
       AND INDEXCOL > ?
       [AND DISTINGUISHER=?]
       
      Returns:
      The Statement for shifting elements in bulk