code: public Either<String, Either<Joiner4All, Mapper4All>> query(String sqlOrJsonQuery, NamedParameters namedParams, Map<String, String> reqHeaders, boolean printToConsole, String queryMode, boolean forceAsync) {
          if ("json".equals(queryMode)) {//TODO : #19
              Either<String, Either<Mapper4All, JSONArray>> result = broker.fireQuery(sqlOrJsonQuery, reqHeaders, true);
              if (result.isLeft()) return new Left<>(result.left().get());
              if (printToConsole) {
                  println(result.right().get().left().get().toString());
              }
              return new Right<String, Either<Joiner4All, Mapper4All>>(new Right<Joiner4All, Mapper4All>(result.right().get().left().get()));
          }
          Program pgm;
          try {
              pgm = getCompiledAST(sqlOrJsonQuery, namedParams, reqHeaders);
          } catch (Exception ex) {
              return new Left<>(ex.getMessage());
          }
          if (pgm instanceof DeleteProgram) {
              return new Left<>(deleteRows((DeleteProgram) pgm, reqHeaders, printToConsole));
          } else if (pgm instanceof DropProgram) {
              return new Left<>(dropTable((DropProgram) pgm, reqHeaders, printToConsole));
          } else if (pgm instanceof InsertProgram) {
              InsertProgram iPgm = (InsertProgram) pgm;
              iPgm.print(printToConsole);
              return new Left<>(overlord.fireTask(iPgm.nthStmnt(0), reqHeaders, !forceAsync && iPgm.waitForCompletion));
          } else {
              return selectRows((QueryProgram) pgm, reqHeaders, printToConsole);
          }
      }
docs: Use this to force asynchronous mode(indexer tasks). You can then call
  {@link DDataSource#pollIndexerTaskStatus(java.lang.String) } to poll and find
  status. Hard limit on any task is 2 hours. See {@link OverlordAccessor} for more.
  @param sqlOrJsonQuery
  @param namedParams
  @param reqHeaders
  @param printToConsole
  @param queryMode
  @param forceAsync
  @return