A composite DataContext is a DataContext that allows you to access several datastores as if they where one. It makes it easy to do queries that span several physical sources without having to deal with the complexity this usually involves.
A note of warning when dealing with composite DataContexts though: Queries will usually take up quite a lot of memory if you try to join tables from separate sources. Some may critisize the fact that MetaModel allows this somewhat "dangerous" behaviour but on the other hand we feel that any powerful tool can be used the wrong way and composite DataContexts are no exception.
Say you have two datastores, a CSV file and a database. Let's first create the composite DataContext from which we access them in a united fashion:
DataContext csvDataContext = ... DataContext databaseDataContext = ... DataContext compositeDataContext = DataContextFactory.createCompositeDataContext(csvDataContext, databaseDataContext);
Because we might encounter name-clashes in table and column names, it is still possible to create our queries using the originial DataContext's schema structures. It is also possible to retrieve the schema structure from the composite.
Table csvTable1 = csvDataContext.getDefaultSchema().getTableByName("customers"); Table csvTable2 = compositeDataContext.getDefaultSchema().getTableByName("customers"); // these should be the same! assert csvTable1 == csvTable2;
We can now create a query using structures from both of the contained DataContexts:
Column csvNameColumn = csvTable1.getColumnByName("name"); Table dbTable = databaseDataContext.getDefaultSchema().getTableByName("customers"); Query q = compositeDataContext.query().from(csvTable1).leftJoin(dbTable) .on(csvNameColumn, dbTable.getColumnByName("name")) .select(csvNameColumn, dbTable.getColumnByName("id")).toQuery();
This query will correspond to (if it was possible to execute something like this in SQL):
SELECT customers.name, "CUSTOMERS"."ID" FROM customers.csv.customers LEFT JOIN PUBLIC."CUSTOMERS" ON customers.name = "CUSTOMERS"."NAME"
And ... executing it will print out a list of customer names (from the CSV file) and their id's in the database. In our test suite we have an example of this, it prints out:
|Lego (not in DB)||null|
|Motor Mint Distributors Inc.||486|