1. A computer-implemented method, comprising: receiving a request for a report comprising a syntax tree that includes one or more data attributes and one or more conditions on the one or more data attributes, the report to be generated based on data stored in a plurality of datastores supporting at least two different storage formats, the at least two different storage formats including at least one relational storage format and at least one non-relational storage format, the syntax tree comprising a format that is abstracted from a particular one of the at least two different storage formats; receiving storage metadata comprising information describing which of the plurality of datastores store the data for the one or more data attributes; presenting, in a user interface, time estimates for generating the report based on retrieving the data from at least two datastores that store the data, the time estimates based at least partly on data retrieval latency for the at least two datastores; accessing a selection of a datastore of the at least two datastores, the selection made through the user interface; generating a query plan comprising one or more queries using the storage metadata and the one or more data attributes obtained from the syntax tree of the request for the report, each of the one or more queries to retrieve at least one of the one or more data attributes from the datastore, the generating of the query plan including: generating each of the one or more queries in a language corresponding to a storage format of the datastore; and modifying each of the one or more queries to access a datastore of the at least two datastores having a lower data retrieval latency; and executing the one or more queries of the query plan to generate the report, the report including data resulting from the executing of the one or more queries.