コード例 #1
0
  /**
   * Method to generate a new query using the passed query as basis.
   *
   * @param language The query language
   * @param ec ExecutionContext
   * @param query The query filter (String) or a previous Query
   * @return The Query
   */
  public Query newQuery(String language, ExecutionContext ec, Object query) {
    if (language == null) {
      return null;
    }

    String languageImpl = language;

    // Find the query support for this language and this datastore
    if (query == null) {
      // TODO We don't have candidate so don't know the StoreManager to use
      throw new NucleusException("Not yet supported for queries with unknown candidate");
    }

    if (query instanceof String) {
      // Single-string query
      String queryString = (String) query;
      String candidateName = null;
      if (languageImpl.equalsIgnoreCase("JDOQL")
          && queryString.toUpperCase().indexOf(" FROM ") > 0) {
        int candidateStart = queryString.toUpperCase().indexOf(" FROM ") + 6;
        int candidateEnd = queryString.indexOf(" ", candidateStart + 1);
        candidateName = queryString.substring(candidateStart, candidateEnd);
      }

      if (candidateName != null) {
        ClassLoaderResolver clr = nucleusCtx.getClassLoaderResolver(null);
        AbstractClassMetaData cmd =
            nucleusCtx.getMetaDataManager().getMetaDataForClass(candidateName, clr);
        StoreManager classStoreMgr =
            ((FederatedStoreManager) storeMgr).getStoreManagerForClass(cmd);
        return classStoreMgr.getQueryManager().newQuery(languageImpl, ec, query);
      }
      // TODO Extract the candidate for this query
      // TODO Find StoreManager for the candidate
      throw new NucleusException("Not yet supported for single-string queries");
    } else if (query instanceof Query) {
      // Based on previous query
      StoreManager storeMgr = ((Query) query).getStoreManager();
      return storeMgr.getQueryManager().newQuery(languageImpl, ec, query);
    } else {
      if (query instanceof Class) {
        // Find StoreManager for the candidate
        Class cls = (Class) query;
        ClassLoaderResolver clr = nucleusCtx.getClassLoaderResolver(cls.getClassLoader());
        AbstractClassMetaData cmd = nucleusCtx.getMetaDataManager().getMetaDataForClass(cls, clr);
        StoreManager classStoreMgr =
            ((FederatedStoreManager) storeMgr).getStoreManagerForClass(cmd);
        return classStoreMgr.getQueryManager().newQuery(languageImpl, ec, query);
      }
      throw new NucleusException(
          "Not yet supported for queries taking in object of type " + query.getClass());
    }
  }