Ejemplo n.º 1
0
  /**
   * Creates a new IncrementalFaultList using a given DataContext and query.
   *
   * @param dataContext DataContext used by IncrementalFaultList to fill itself with objects.
   * @param query Main query used to retrieve data. Must have "pageSize" property set to a value
   *     greater than zero.
   * @param maxFetchSize maximum number of fetches in one query
   */
  public IncrementalFaultList(DataContext dataContext, Query query, int maxFetchSize) {
    QueryMetadata metadata = query.getMetaData(dataContext.getEntityResolver());
    if (metadata.getPageSize() <= 0) {
      throw new CayenneRuntimeException(
          "Not a paginated query; page size: " + metadata.getPageSize());
    }

    this.dataContext = dataContext;
    this.pageSize = metadata.getPageSize();
    this.rootEntity = metadata.getObjEntity();

    if (rootEntity == null) {
      throw new CayenneRuntimeException(
          "Pagination is not supported for queries not rooted in an ObjEntity");
    }

    // create an internal query, it is a partial replica of
    // the original query and will serve as a value holder for
    // various parameters
    this.internalQuery = new SelectQuery<Object>(rootEntity);
    this.internalQuery.setFetchingDataRows(metadata.isFetchingDataRows());
    this.internalQuery.setPrefetchTree(metadata.getPrefetchTree());

    this.helper = createHelper(metadata);
    this.idWidth = metadata.getDbEntity().getPrimaryKeys().size();

    List<Object> elementsUnsynced = new ArrayList<>();
    fillIn(query, elementsUnsynced);
    this.elements = Collections.synchronizedList(elementsUnsynced);

    this.maxFetchSize = maxFetchSize;
  }