Implement and test the methods allowing queries on Enumerables. The methods
are specified in ExtendedEnumerable, DefaultEnumerable calls the
implementations in Extensions. We'll do these in tranches. Each time you
implement a method, add a test similar to Linq4jTest.testWhere.
Try to refactor out some helper (named inner) classes, rather than creating
2 or 3 anonymous classes per method.
Third tranche: implement groupBy for Enumerable.
Fourth tranche: implement any, all, aggregate, sum, min, max, average
for Enumerable.
Sixth tranche: implement union, intersect, except, distinct methods
for Enumerable.
Seventh tranche: first, last, defaultIfEmpty, elementAtOrDefault,
firstOrDefault, lastOrDefault for Enumerable. May need to add a class
parameter so that we can generate the right default value.
Eighth tranche: implement orderBy, reverse for Enumerable.
Ninth tranche: implement methods that require EqualityComparer.
Last tranche: all remaining methods for Enumerable.
Parser support. Either modify a Java parser (e.g. OpenJDK), or write a
pre-processor. Generate Java code that includes expression trees.
Port Enumerable and Queryable to Scala. Change classes (in particular,
collections and function types) so that user code is looks like concise,
native Scala. Share as much of the back-end as possible with linq4j, but
don't compromise the Scala look-and-feel of the front-end. Use adapters
(and sacrifice a bit of performance) if it helps.
Write a simple LINQ-to-SQL provider. This would generate SQL and get data
from JDBC. It's a prototype, demonstrating that we can connect the dots.
Plan to throw it away.
In the prototype LINQ-to-SQL provider, write a simple rule to recognize a
select list and where clause and push them down to SQL.
Test Scala front-end against LINQ-to-SQL provider.
A better provider using a planner framework.
JDBC driver on top of linq4j (not necessarily on top of the
Queryable/Expression object model; more likely on the query model that this
translates to).
Use planner framework to build back-ends to non-SQL data sources (e.g.
MongoDB, Hadoop, text files).