in jones-mysql/impl/MySQLConnection.js [634:759]
function initializeProjection(projection) {
var mysql = {};
projection.mysql = mysql;
var i, j;
var sector, sectorName;
var parentSectorName;
var select, from, on, alias, order;
var thisOn, otherOn, and;
var selectDelimiter, fromDelimiter, orderDelimiter;
var columnName;
var joinType, joinIndex;
var offset;
var keyField, nonKeyField;
// create the sql query for the find method.
select = 'SELECT ';
from = ' FROM ';
order = '';
selectDelimiter = '';
fromDelimiter = '';
orderDelimiter = '';
alias = 0;
offset = 0;
// always order by first table primary key to avoid duplicates in scan results
for (i = 0; i < projection.sectors.length; ++i) {
sector = projection.sectors[i];
udebug.log_detail('initializeProjection for sector\n', sector);
// offset of each sector into column in row
sector.offset = offset;
offset += sector.keyFields.length + sector.nonKeyFields.length;
// set up the table names
sector.tableName = sector.tableHandler.dbTable.database + '.' + sector.tableHandler.dbTable.name;
sectorName = 't' + i;
parentSectorName = 't' + sector.parentSectorIndex;
joinType = '';
on = '';
if (sector.parentFieldMapping && i > 0) {
if (sector.parentFieldMapping.toMany && sector.parentFieldMapping.manyTo) {
// join table mapping
// create a join table reference based on current table name
// join tables are "between" tables that are joined for many-to-many relationships
// ... t1 LEFT OUTER JOIN customerdiscount AS t15 on [t1.k = t15.k and...]
// LEFT OUTER JOIN discount AS t2 on [t15.k = t2.k and ...]
sector.joinTableName = sector.joinTableHandler.dbTable.database + '.' + sector.joinTableHandler.dbTable.name;
sector.joinTableAlias = sectorName + 'JOIN';
udebug.log_detail('initializeProjection join table handling for', sector.joinTableName, 'AS', sector.joinTableAlias,
'thisForeignKey.columnNames', sector.parentFieldMapping.thisForeignKey.columnNames,
'otherForeignKey.columnNames', sector.parentFieldMapping.otherForeignKey.columnNames);
// generate the join from the previous domain table to the join table
joinType = ' LEFT OUTER JOIN ';
thisOn = ' ON ';
and = '';
for (joinIndex = 0; joinIndex < sector.parentFieldMapping.thisForeignKey.columnNames.length; ++joinIndex) {
thisOn += and + parentSectorName + '.' + sector.parentFieldMapping.thisForeignKey.targetColumnNames[joinIndex] + ' = ' +
sector.joinTableAlias + '.' + sector.parentFieldMapping.thisForeignKey.columnNames[joinIndex];
and = ' AND ';
}
from += fromDelimiter + joinType + sector.joinTableName + ' AS ' + sector.joinTableAlias + thisOn;
// generate the join from the join table to this domain table
otherOn = ' ON ';
and = '';
for (joinIndex = 0; joinIndex < sector.parentFieldMapping.otherForeignKey.columnNames.length; ++joinIndex) {
otherOn += and + sector.joinTableAlias + '.' + sector.parentFieldMapping.otherForeignKey.columnNames[joinIndex] + ' = ' +
sectorName + '.' + sector.parentFieldMapping.otherForeignKey.targetColumnNames[joinIndex];
and = ' AND ';
}
from += fromDelimiter + joinType + sector.tableName + ' AS ' + sectorName + otherOn;
} else {
// foreign key mapping for one-to-one, one-to-many, and many-to-one relationships
joinType = ' LEFT OUTER JOIN ';
on = ' ON ';
and = '';
for (joinIndex = 0; joinIndex < sector.thisJoinColumns.length; ++joinIndex) {
on += and + parentSectorName + '.' + sector.otherJoinColumns[joinIndex] + ' = ' +
sectorName + '.' + sector.thisJoinColumns[joinIndex];
and = ' AND ';
}
from += fromDelimiter + joinType + sector.tableName + ' AS ' + sectorName + on;
}
} else {
// first table is always t0
from += sector.tableName + ' AS ' + sectorName;
fromDelimiter = ' ';
}
if (i == 0 || sector.parentFieldMapping.toMany) {
// order by key columns that can have multiple values (toMany relationships and first sector)
for (j = 0; j < sector.keyFields.length; ++j) {
keyField = sector.keyFields[j];
columnName = keyField.columnName;
order += orderDelimiter + sectorName + '.' + columnName;
orderDelimiter = ', ';
}
}
// add key column names to SELECT clause
for (j = 0; j < sector.keyFields.length; ++j) {
keyField = sector.keyFields[j];
columnName = keyField.columnName;
select += selectDelimiter + sectorName + '.' + columnName + ' AS \'' + alias++ + '\'';
selectDelimiter = ', ';
}
// add non-key column names to SELECT clause
for (j = 0; j < sector.nonKeyFields.length; ++j) {
nonKeyField = sector.nonKeyFields[j];
columnName = nonKeyField.columnName;
select += selectDelimiter + sectorName + '.' + columnName + ' AS \'' + alias++ + '\'';
selectDelimiter = ', ';
}
}
mysql.select = select;
mysql.from = from;
mysql.sectors = projection.sectors;
if (order) {
mysql.order = ' ORDER BY ' + order;
} else {
mysql.order = '';
}
// mark this as having been processed
projection.mysql.id = projection.id;
if (udebug.is_debug()) {udebug.log_detail('initializeProjection', select, from);}
}