code: func (c *Connector) Range(_ context.Context, ei *dosa.EntityInfo, columnConditions map[string][]*dosa.Condition, minimumFields []string, token string, limit int) ([]map[string]dosa.FieldValue, string, error) {
  	c.lock.RLock()
  	defer c.lock.RUnlock()
  
  	partitionRange, key, err := c.findRange(ei, columnConditions, true)
  	if err != nil {
  		return nil, "", errors.Wrap(err, "Invalid range conditions")
  	}
  	if partitionRange == nil {
  		return []map[string]dosa.FieldValue{}, "", nil
  	}
  
  	if token != "" {
  		// if we have a token, use it to determine the offset to start from
  		values, err := decodeToken(token)
  		if err != nil {
  			return nil, "", errors.Wrapf(err, "Invalid token %q", token)
  		}
  		found, offset := findInsertionPoint(key, partitionRange.values(), values)
  		if found {
  			partitionRange.start += offset + 1
  		} else {
  			partitionRange.start += offset
  		}
  	}
  
  	if limit == dosa.AdaptiveRangeLimit {
  		limit = defaultRangeLimit
  	}
  
  	slice := partitionRange.values()
  	token = ""
  	if len(slice) > limit {
  		token = makeToken(slice[limit-1])
  		slice = slice[:limit]
  	}
  
  	return copyRows(slice), token, nil
  }
docs: // Range returns a slice of data from the datastore