code: func (c *Connector) Read(_ context.Context, ei *dosa.EntityInfo, values map[string]dosa.FieldValue, minimumFields []string) (map[string]dosa.FieldValue, error) {
  	c.lock.RLock()
  	defer c.lock.RUnlock()
  	entityRef := c.data[ei.Def.Name]
  	encodedPartitionKey, err := partitionKeyBuilder(ei.Def.Key, values)
  	if err != nil {
  		return nil, errors.Wrapf(err, "Cannot build partition key for entity %q", ei.Def.Name)
  	}
  	if c.data[ei.Def.Name] == nil {
  		return nil, &dosa.ErrNotFound{}
  	}
  	partitionRef := entityRef[encodedPartitionKey]
  	// no data in this partition? easy out!
  	if len(partitionRef) == 0 {
  		return nil, &dosa.ErrNotFound{}
  	}
  
  	if len(ei.Def.Key.ClusteringKeySet()) == 0 {
  		return copyRow(partitionRef[0]), nil
  	}
  	// clustering key, search for the value in the set
  	found, inx := findInsertionPoint(ei.Def.Key, partitionRef, values)
  	if !found {
  		return nil, &dosa.ErrNotFound{}
  	}
  	return copyRow(partitionRef[inx]), nil
  }
docs: // Read searches for a row. First, it finds the partition, then it searches in the partition for
  // the data, and returns it when it finds it. Again, sort.Search does most of the heavy lifting
  // within a partition