# DataIterator Class

```
package com.collager.trillo.model;

import java.util.List;
import java.util.Map;
import com.collager.trillo.pojo.Result;
import com.collager.trillo.util.BaseApi;
import com.collager.trillo.util.CoreDSUtil;
import com.collager.trillo.util.DSApi;
import com.collager.trillo.util.LogApi;
import com.collager.trillo.util.Util;

public class DataIterator {
 
  private DataRequest dataRequest = null;
  private DataResult dataResult = null;
  private Object result = null;
  private int index = 0;
  private boolean iteratorEnded = false;
  private boolean noMorePage = false;
  private boolean orderById = false;
  private String originalQuery = null;
  private Object lastId;
  private String idAttrName = "id";
  private String dsType = CoreDSUtil.MYSQL;
  private boolean firstPage = true;
  private int nextStart = 1;
  private String countQuery = null;
  private int totalItems = -1;
  private boolean errored = false;
  private String message = null;
  
   public DataIterator(String className, String where, String orderBy, int start, int pageSize) {

    dataRequest = new DataRequest();
    dataRequest.setClassName(className);
    dataRequest.setWhere(where);
    dataRequest.setOrderBy(orderBy);
    dataRequest.setStart(start);
    dataRequest.setSize(pageSize);
    dataRequest.setUsingRowLimits(true);
    dataRequest.setAppName(BaseApi.app(className));
    dataRequest.setDsName(BaseApi.ds(className));
    dataRequest.setClassName(BaseApi.cls(className));
  }
  
  … more constructors …  
  public DataIterator(String className, Exp filter, String orderBy, int start, int pageSize) {
    … … …
  }
  
  
  public DataIterator(int start, int pageSize, String sqlQuery) {
    // using sql query
    dataRequest = new DataRequest();
    dataRequest.setSql(sqlQuery);
    dataRequest.setStart(start);
    dataRequest.setSize(pageSize);
    dataRequest.setUsingRowLimits(true);
  }
  
  public DataIterator(String appName, String dsName, int start, int pageSize, String sqlQuery) {
    … … …
  }
  
    
  … … …

  public DataRequest getDataRequest() {
    return dataRequest;
  }
  
  public DataResult getDataResult() {
    return dataResult;
  }

  public Object getResult() {
    return result;
  }
  
  public Object hasError() {
    return errored;
  }

  public Object getMessage() {
    return message;
  }
  
  public int getIndex() {
    return index;
  }

  public Result initialize() {
    if (iteratorEnded) {
      return Result.getFailedResult("DataIterator has ended");
    }
    if (dataResult == null) {
      fetch();
    }
    
    if (errored) {
      return Result.getFailedResult(message);
    }
    
    return Result.getSuccessResult();
  }
  
  @SuppressWarnings("unchecked")
  public Object getNext() {
    // return next record
  }

  public boolean hasNext() {
    // checks if has next record
  }

  public List<Map<String, Object>> getPage() {
    // return a page
  }
  
  public boolean hasPage() {
    // returns if more pages pending to iterate
  }
  
  private void fetch() {
    // internal implementation
  }
  
  @SuppressWarnings("unchecked")
  private DataResult retrievePage() {
    // internal implementation
  }

  public int getTotalItems() {
    if (totalItems != -1) {
      return totalItems;
    }
    if (iteratorEnded) {
      return totalItems;
    }
    if (dataResult == null) {
      fetch();
    }
    return totalItems;
  }

  public String getCountQuery() {
    return countQuery;
  }

  // to get the totalCount
  public void setCountQuery(String countQuery) {
    this.countQuery = countQuery;
  }
}

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://trillo.gitbook.io/trillo-workbench-lessons/appendixes/dataiterator-class.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
