Add the schemas to table mappings
Add String.asLikeLiteral()
Fixed AbstractI2b2Metadata::getChildren
Use String::asLikeLiteral()
Test in-memory db has to include schema creation

Updated example in DataSource.groovy
ConceptKey: IllegalArgExc on null constructor args
Transform business exceptions into error responses
Add ConceptsController
Fix AbstractI2b2Metadata::getConceptKey()

The table table was erroneously being used as the table code.
Fix ConceptsController::getChildren()
Refactor/bring in line with -api I2b2 & its parent

Add getMetadata() and move stuff from I2b2 to AbstractI2b2Metadata
Add Birn domain class (i2b2 metadata)
Performance improv: cache table code immediately
JavaScript forntend needs to know more about terms

Unfortunately, it needs to know too much. See the comment on
OntologyTermMarshaller.
Add QuerySpecifyingType::getProcessedDimensionCode

Right now, it's not actually needed.
Minimal mapping for I2B2_SECURE
Adapt to ::getConceptsByCriteria() removal on -api
Added configuration to set i2b2 user and group

The configuration names are:
  - org.transmartproject.i2b2.user_id
  - org.transmartproject.i2b2.group_id
Bring filename in line with class name
Implments QueriesResource (querytool)

Overview of the new classes:

QtQueryMaster
  Domain class. Maps to i2b2's table i2b2demodata.qt_query_master. This
  contains the query definition, its create date and the name of the
  query.

QtQueryInstance
  Domain class. Maps to i2b2's table i2b2demodata.qt_query_instance. In
  principle, a query master can have associated with it an arbitrary
  number of query instances. It contains a reference to the owning query
  master, a start and end date, a status (error, pending, complete,
  etc.) and a message that can contain an exception trace. This table is
  not particularly important for tranSMART.

QtQueryResultInstance
  Domain class. Implements the API's class QueryResult. Maps to i2b2's
  table i2b2demodata.qt_query_result_instance. In principle, it can be
  associated with an arbitrary number of QtQueryInstance instances. It
  contains a reference to the owning QtQueryInstance, the type of result
  set (in the current implementation, always 1, which means a patient
  set), the size of result set (or -1 if there was an error), start and
  end dates, a status (see QtQueryInstance), a description for the
  result set, and possibly an error message with the stack trace (same
  as QtQueryInstance).

QueriesResourceService
  Implementation of API's QueriesResource. Currently, it has only one
  public method: runQuery(QueryDefinition definition). This method
  creates the appropriate QtQueryMaster, QtQueryInstance and
  QtQueryResultInstance objects, generates an sql query from the
  QueryDefinition (via its collaborator patientSetQueryBuilderService)
  and executes this query, which populates the qt_patient_set_collection
  table. The QtQueryInstance and QtQueryResultInstance are then updated
  in face of the execution of the query, with information such as the
  size of the obtained result set.
  To create the XML version of the QueryDefinition that's necessary to
  populate the QtQueryMaster object, the collaborator
  queryDefinitionXmlService is used.

PatientSetQueryBuilderService
  Converts a QueryDefinition into an SQL query that populates the
  qt_patient_set_collection. It also validates the QueryDefinition and
  throws InvalidRequestException if it finds any error.

QueryDefinitionXmlService
  Handles the conversion of a QueryDefinition to a XML string that's
  understood by i2b2, and which we also appropriate for our storage
  needs. In future, it will also support the inverse function.