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 Detail

      • 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 Detail

      • AbstractListStore

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

      • iterator

        public Iterator<E> iterator​(org.datanucleus.state.ObjectProvider op)
        Accessor for an iterator through the list elements.
        Specified by:
        iterator in interface org.datanucleus.store.types.scostore.CollectionStore<E>
        Specified by:
        iterator in class ElementContainerStore
        Parameters:
        op - ObjectProvider for the container.
        Returns:
        The Iterator
      • listIterator

        public ListIterator<E> listIterator​(org.datanucleus.state.ObjectProvider op)
        Accessor for an iterator through the list elements.
        Specified by:
        listIterator in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider for the container.
        Returns:
        The List Iterator
      • listIterator

        protected abstract ListIterator<E> listIterator​(org.datanucleus.state.ObjectProvider op,
                                                        int startIdx,
                                                        int endIdx)
        Accessor for an iterator through the list elements.
        Parameters:
        op - ObjectProvider 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.ObjectProvider op,
                           E element,
                           int size)
        Method to add an element to the List.
        Specified by:
        add in interface org.datanucleus.store.types.scostore.CollectionStore<E>
        Parameters:
        op - The ObjectProvider
        element - The element to remove
        size - Size of the current list (if known, -1 if not)
        Returns:
        Whether it was added successfully.
      • add

        public void add​(org.datanucleus.state.ObjectProvider op,
                        E element,
                        int index,
                        int size)
        Method to add an element to the List.
        Specified by:
        add in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        element - The element to add.
        index - The location to add at
        op - The ObjectProvider.
      • addAll

        public boolean addAll​(org.datanucleus.state.ObjectProvider op,
                              Collection<E> elements,
                              int size)
        Method to add a collection of elements to the List.
        Specified by:
        addAll in interface org.datanucleus.store.types.scostore.CollectionStore<E>
        Parameters:
        op - The ObjectProvider
        elements - The elements to remove
        size - Current size of the list (if known). -1 if not known
        Returns:
        Whether they were added successfully.
      • addAll

        public boolean addAll​(org.datanucleus.state.ObjectProvider op,
                              Collection<E> elements,
                              int index,
                              int size)
        Method to add all elements from a Collection to the List.
        Specified by:
        addAll in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - The ObjectProvider
        elements - The collection
        index - The location to add at
        size - Current size of the list (if known). -1 if not known
        Returns:
        Whether it was successful
      • internalAdd

        protected abstract boolean internalAdd​(org.datanucleus.state.ObjectProvider op,
                                               int startAt,
                                               boolean atEnd,
                                               Collection<E> elements,
                                               int size)
        Internal method for adding an item to the List.
        Parameters:
        op - The ObjectProvider
        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.ObjectProvider op,
                     int index)
        Method to retrieve an element from the List.
        Specified by:
        get in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider for the owner
        index - The index of the element required.
        Returns:
        The object
      • indexOf

        public int indexOf​(org.datanucleus.state.ObjectProvider op,
                           Object element)
        Accessor for the indexOf an object in the List.
        Specified by:
        indexOf in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider for the owner
        element - The element.
        Returns:
        The index
      • lastIndexOf

        public int lastIndexOf​(org.datanucleus.state.ObjectProvider op,
                               Object element)
        Method to retrieve the last index of an object in the list.
        Specified by:
        lastIndexOf in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider for the owner
        element - The object
        Returns:
        The last index
      • remove

        public boolean remove​(org.datanucleus.state.ObjectProvider op,
                              Object element,
                              int size,
                              boolean allowDependentField)
        Method to remove the specified element from the List.
        Specified by:
        remove in interface org.datanucleus.store.types.scostore.CollectionStore<E>
        Parameters:
        op - ObjectProvider for the owner
        element - The element to remove.
        size - Current size of list if known. -1 if not known
        allowDependentField - Whether to allow any cascade deletes caused by this removal
        Returns:
        Whether it was removed successfully.
      • remove

        public E remove​(org.datanucleus.state.ObjectProvider op,
                        int index,
                        int size)
        Method to remove an object at an index in the List. If the list is ordered, will remove the element completely since no index positions exist.
        Specified by:
        remove in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider
        index - The location
        size - Current size of the list (if known). -1 if not known
        Returns:
        The object that was removed
      • internalRemove

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

        protected abstract void internalRemoveAt​(org.datanucleus.state.ObjectProvider op,
                                                 int index,
                                                 int size)
        Internal method to remove an object at a location from the List.
        Parameters:
        op - ObjectProvider
        index - The index of the element to remove
        size - Current list size (if known). -1 if not known
      • subList

        public List<E> subList​(org.datanucleus.state.ObjectProvider op,
                               int startIdx,
                               int endIdx)
        Method to retrieve a list of elements in a range.
        Specified by:
        subList in interface org.datanucleus.store.types.scostore.ListStore<E>
        Parameters:
        op - ObjectProvider
        startIdx - From index (inclusive).
        endIdx - To index (exclusive)
        Returns:
        Sub List of elements in this range.
      • getIndicesOf

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

        protected int internalIndexOf​(org.datanucleus.state.ObjectProvider op,
                                      Object element,
                                      String stmt)
        Internal method to find the index of an element.
        Parameters:
        op - ObjectProvider
        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.ObjectProvider op,
                                        int index,
                                        String stmt,
                                        int size)
        Internal method to remove an object at a location in the List.
        Parameters:
        op - ObjectProvider
        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.ObjectProvider op,
                                          org.datanucleus.store.connection.ManagedConnection conn,
                                          boolean batched,
                                          int start,
                                          int amount,
                                          boolean executeNow)
                                   throws MappedDatastoreException
        Method to process a "shift" statement for all rows from the start point, updating the index in the list for the specified owner.
        Parameters:
        op - StateManager of the owner
        conn - The connection
        batched - Whether the statement is batched
        start - The start index for the shift
        amount - Amount to shift by (negative means shift down)
        executeNow - Whether to execute the statement now (or wait for batching)
        Returns:
        Return code(s) from any executed statements
        Throws:
        MappedDatastoreException - Thrown if an error occurs
      • internalShift

        protected int[] internalShift​(org.datanucleus.state.ObjectProvider op,
                                      org.datanucleus.store.connection.ManagedConnection conn,
                                      boolean batched,
                                      int oldIndex,
                                      int amount,
                                      boolean executeNow)
                               throws MappedDatastoreException
        Method to process a "shift" statement, updating the index in the list of the specified index.
        Parameters:
        op - ObjectProvider
        conn - The connection
        batched - Whether the statement is batched
        oldIndex - The old index
        amount - Amount to shift by (negative means shift down)
        executeNow - Whether to execute the statement now (or wait for batching)
        Returns:
        Return code(s) from any executed statements
        Throws:
        MappedDatastoreException - 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
      • 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
      • 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