public Object visit(ASTSelect node, Object data) {
StringBuffer buf = (StringBuffer) data;
Node child0 = node.jjtGetChild(0);
ASTPath path;
if (child0 instanceof ASTPath) {
path = (ASTPath) child0;
if (path.isCMPField()) {
// set the select object
JDBCCMPFieldBridge selectField = (JDBCCMPFieldBridge) path.getCMPField();
selectManager = (JDBCStoreManager) selectField.getManager();
selectObject = selectField;
setTypeFactory(selectManager.getJDBCTypeFactory());
addJoinPath(path);
selectAlias = aliasManager.getAlias(path.getPath(path.size() - 2));
SQLUtil.getColumnNamesClause(selectField, selectAlias, buf);
} else {
// set the select object
JDBCEntityBridge selectEntity = (JDBCEntityBridge) path.getEntity();
selectManager = (JDBCStoreManager) selectEntity.getManager();
selectObject = selectEntity;
setTypeFactory(selectManager.getJDBCTypeFactory());
selectEntity(path, node.distinct, buf);
}
} else {
// the function should take a path expression as a parameter
path = getPathFromChildren(child0);
if (path == null) {
throw MESSAGES.functionInSelectNoPath();
}
if (path.isCMPField()) {
JDBCCMPFieldBridge selectField = (JDBCCMPFieldBridge) path.getCMPField();
selectManager = (JDBCStoreManager) selectField.getManager();
if (selectField.getJDBCType().hasMapper())
this.functionJDBCType = selectField.getJDBCType();
} else if (path.isCMRField()) {
JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge) path.getCMRField();
selectManager = (JDBCStoreManager) cmrField.getEntity().getManager();
addJoinPath(path);
} else {
final JDBCEntityBridge entity = (JDBCEntityBridge) path.getEntity();
selectManager = (JDBCStoreManager) entity.getManager();
addJoinPath(path);
}
setTypeFactory(selectManager.getJDBCTypeFactory());