code: func (c *client) Range(ctx context.Context, r *RangeOp) ([]DomainObject, string, error) {
  	if !c.initialized {
  		return nil, "", &ErrNotInitialized{}
  	}
  	// look up the entity in the registry
  	re, err := c.registrar.Find(r.object)
  	if err != nil {
  		return nil, "", errors.Wrap(err, "Range")
  	}
  
  	// now convert the client range columns to server side column conditions structure
  	columnConditions, err := ConvertConditions(r.conditions, re.table)
  	if err != nil {
  		return nil, "", errors.Wrap(err, "Range")
  	}
  
  	// convert the fieldsToRead to the server side equivalent
  	fieldsToRead, err := re.ColumnNames(r.fieldsToRead)
  	if err != nil {
  		return nil, "", errors.Wrap(err, "Range")
  	}
  
  	// call the server side method
  	values, token, err := c.connector.Range(ctx, re.EntityInfo(), columnConditions, fieldsToRead, r.token, r.limit)
  	if err != nil {
  		return nil, "", errors.Wrap(err, "Range")
  	}
  
  	objectArray := objectsFromValueArray(r.object, values, re, nil)
  	return objectArray, token, nil
  }
docs: // Range uses the connector to fetch DOSA entities for a given range.