Пример #1
0
  // 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();
  }