// generates the 'select' part of the SQL select statement public String selectProperties(DataObj d) { StringBuilder s = new StringBuilder(1024); String name = d.getName(); s.append("select "); boolean firstField = true; for (Field f : d.getFields()) { if (firstField) { firstField = false; s.append(name + "." + f.getName() + " "); } else { s.append(", " + name + "." + f.getName() + " "); } } return s.toString(); }
public String toJsonObj(DataObj d) { StringBuilder s = new StringBuilder(1024); s.append(returnTab(2) + "var data = {\n"); String name = d.getName(); boolean firstField = true; for (Field f : d.getFields()) { // update will not change the auto-created id if (f.getName().equals("ID")) { continue; } if (firstField) { firstField = false; s.append(returnTab(3) + f.getName() + " : " + name + "." + f.getName() + " "); } else { s.append(",\n" + returnTab(3) + f.getName() + " : " + name + "." + f.getName() + " "); } } s.append("\n" + returnTab(2) + "};\n"); return s.toString(); }
// query NO starts at 0 // queryNoNext starts at 1 // depth starts at 0 // DataObj d - data object that's foreign keys are being expanded from ids to JSON objects // depth - tab placement // queryNo - which query is currently public String evaluateFK( DataObj d, int depth, String lastQueryFrom, String lastQueryWhere, String dbQueryParam) { StringBuilder s = new StringBuilder(4028); HashMap<DataObj, List<String>> dataObjsMap = new HashMap<DataObj, List<String>>(); // First, evaluate all the foreign keys on the current object for (Field f : d.getFields()) { if (f.getType() == Field.Type.FOREIGN_KEY) { // get the object corresponding to the foreign key field str // so that you know what fields to get in sql statement for (DataObj fkObj : d.getDependencies()) { if ((fkObj.getName()).equals(f.getTypeStr())) { String parentRow = "rows" + Integer.toString(queryNo); String fkRow = "rows" + Integer.toString(queryNoNext); String fkName = fkObj.getName(); String parName = d.getName(); // The 'from' part of a SQL select FROM where String queryFrom = lastQueryFrom + " " + fkName + " as " + fkName + " "; // The 'where' part of a SQL select from WHERE String queryWhere = lastQueryWhere + " " + fkName + ".id = " + parName + "." + f.getName(); // Recursive calls do need this text if (queryNo == 0) { queryFrom += " inner join " + parName + " as " + parName + " "; queryWhere += " and " + parName + ".id = ?"; } if (depth == 0) { s.append(returnTab(2 + depth) + "totalCount += rows0.length;\n"); } s.append(returnTab(2 + depth) + parentRow + ".forEach(function(row) { \n"); s.append(returnTab(3 + depth) + "query = \"" + selectProperties(fkObj) + "\";\n"); s.append(returnTab(3 + depth) + "query += \"from " + queryFrom + "\";\n"); s.append(returnTab(3 + depth) + "query += \"where " + queryWhere + "\";\n"); s.append( returnTab(3 + depth) + "con.query(query, " + dbQueryParam + ", function(err, " + fkRow + ",fields) {\n"); s.append(returnTab(4 + depth) + "if (err) throw err;\n"); s.append(returnTab(4 + depth) + "row." + f.getName() + " = " + fkRow + "[0];\n"); // Store this object, so below you can check if it has // foreign keys that have to be evaluated ArrayList<String> a = new ArrayList<String>(); a.add(queryFrom + " inner join "); a.add(queryWhere + " and "); a.add(Integer.toString(queryNoNext)); dataObjsMap.put(fkObj, a); depth += 2; queryNoNext++; break; } } } } // Second, recursively evaluate all of the foreign key objects // The keys of dataObjsMap are all of the objects that are // DataObj d's object dependencies // The value is an array [0] - queryFrom // [1] - queryWhere // [2] - queryNo // The dataObjsMap is populated roughly 10 lines up Iterator it = dataObjsMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry one = (Map.Entry) it.next(); DataObj key = (DataObj) one.getKey(); List<String> values = (List<String>) dataObjsMap.get(key); // reset global variable queryNo // why are we parsing ints? Need to parse the int because // [2] queryNo is an int queryNo = Integer.parseInt(values.get(2)); s.append( evaluateFK(key, depth, (String) values.get(0), (String) values.get(1), dbQueryParam)); } if (depth > tabDepth) { tabDepth = depth; } return s.toString(); }