/* DAX engines have 3 ways of answering a query: 1. Formula Engine ask for small data caches from Storage Engine and then Formula Engine decides how to evaluate those data caches, it can do a simple iteration, lookup between 2 or more data cache or even do a CROSSJOIN of 2 or more data caches 2. Storage Engine builds a full materialized table in memory and then give it back to Formula Engine, but that materialized (uncompressed) table can be so huge that it can take up a lot of space on the RAM, the Contoso Model provided by Microsoft has 12.5 million rows and if Storage Engine materializes that table it will consume around 600-900 megabytes of my RAM, some of the functions that can create huge materialized table in memory are SAMPLE & GROUPBY 3. Engines know that the materialized version will be an expensive operation so Storage Engine calls Formula Engine for each row of the data and that's when we see CALLBACKDATAID it simply represents that the condition is too complex for Storage Engine so it needs help of Formula Engine.