The PR was just a batch of commits related to DboSource. I tried to explain each one in their respective log.

* The cache is being polluted with different cache keys containing the same values (for fields and virtual fields); e.g. each line of [this tests](https://github.com/bar/cakephp/commit/b4197dfba521e6a5af77665dbed100b51913c143#diff-7862e725092ab6ae6e540db72f9c4f4eR995) and [this tests](https://github.com/bar/cakephp/commit/a95da6387b8ac648961ae0d4451603739734ff0a#diff-7862e725092ab6ae6e540db72f9c4f4eR1304) misses the cache query and ends up doing the same process again and creates a new cache entry.

Most of the idea was to use the constructed fields/virtual to create the cache key, that way it will be the same. So the idea was to move the code which was below
```
if ($return = $this->cacheMethod(__FUNCTION__, $cacheKey)) {
  return $return;
}
```
above it.

When ```$fields``` are used, they should be normalized before, not after querying the cache. ```_normalizeFields()``` does that for ```$fields```, it is the same logic with some alterations (taking care of more cases).