Pregunta

Estoy intentando consultar el almacén de datos de Google para algo como (con pm --> persistanceManager):

String filters = "(  field == 'value' ||  field == 'anotherValue' )";
Query query = pm.newQuery(myType.class, filters);

Cuando ejecuto, obtengo: El almacén de datos de App Engine no es compatible con el operador O.

¿Cuál es el mejor enfoque en la experiencia de las personas para este tipo de consultas?

¡Cualquier ayuda apreciada!

¿Fue útil?

Solución

Realizar varias consultas. El almacén de datos, como todas las otras bases de datos, no es capaz de ejecutar de manera eficiente disyunciones. A diferencia de otras bases de datos, se expone esta dificultad para el usuario, para que quede claro que lo que está haciendo no es eficiente. Su única solución es ejecutar varias consultas - una para cada uno, o -. Y combinarlos

Otros consejos

No sé si implementaciones JDO y JPA de GAE apoyan esto, pero utilizando el API de bajo nivel, puede utilizar el operador in para esto, en una consulta.

Query query = new Query("Issue");
List<String> list = Arrays.asList("NEW", "OPEN", "ACCEPTED");
query.addFilter("status", FilterOperator.IN, list);

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
PreparedQuery preparedQuery = datastore.prepare(query);
for (Entity entity : preparedQuery.asIterable()) {
    // should iterate over 'NEW', 'OPEN' and 'ACCEPTED' issues
}

De acuerdo a Google App Engine: consultas e índices:

Filtros de consulta

A filtrar Especifica un nombre de campo, un operador y un valor.El valor debe ser proporcionado por la aplicación;No puede referirse a otra propiedad o calcularse en términos de otras propiedades.El operador puede ser cualquiera de los siguientes: < <= == >= >

Nota: La interfaz Java DataStore no es compatible con los operadores de filtro! = En la interfaz Python DataStore.(En la interfaz de Python, estos operadores se implementan en las bibliotecas del lado del cliente como consultas múltiples de almacenes de datos;No son características del almacén de datos en sí).

El sujeto de un filtro puede ser cualquier campo de objeto, incluida la clave principal y el grupo de la entidad (ver Actas).

Una entidad debe coincidir con todos los filtros para ser un resultado.En la sintaxis de cadena JDOQL, se especifican múltiples filtros separados por && (lógico "y").No son compatibles con otras combinaciones lógicas de filtros (lógicos "o", "no").

Debido a la forma en que el almacén de datos de APP Engine ejecuta consultas, una sola consulta no puede usar filtros de desigualdad (< <= >= >) en más de una propiedad.Se permiten múltiples filtros de desigualdad en la misma propiedad (como consultar para un rango de valores).Ver Restricciones a las consultas.

Básicamente, tendrá que reestructurar sus datos para que pueda encontrar lo que está buscando con una condición o múltiples condiciones "y" o tendrá que recuperar los datos mediante dos (o más) consultas. y filtrarlo/combinarlo en su código.

Siento llegar tarde al juego .. Sólo corrió a través de su pregunta hoy.

Otra forma de "simular" 'IN' y 'O' comportamiento es utilizar el "bajo nivel" API de almacén de datos. El DatastoreService apoya un método get () que acepta una colección de llaves y devuelve un mapa de todas las entidades que coinciden con la aprobada en Cayos. Es una interfaz, pero hay una DatastoreServiceFactory útil que se disponga para dispensar un ejemplo listo para su uso.

Por desgracia, Google decidió que ellos no quieren promover este enfoque API de bajo nivel y prefieren que los desarrolladores utilizan JDO o JPA, así que no hay documentación disponible que no sea los JavaDocs y cualquier código que muestras que se pueden encontrar cuando Google "DatastoreService".

TL

Noticias última hora que .. por lo menos yo estoy haciendo la misma. Como yo estaba descargando el último SDK de Java para GAE me di cuenta en el comunicado señala que "Número 29: Exponer lote se" se fijó en la última versión (versión 1.2.1). Básicamente, parece que (estoy buscando el mismo apoyo que parece) puede tener una alternativa basada JDO en lugar de tener que bajar a la API de almacén de datos "de bajo nivel". Acabo de descargar la última versión de Java SDK GAE así que no he tenido la oportunidad de probar nada, pero quería darle una mano a mano lo antes posible. Voy a publicar nada más que aprender después de haber tenido la oportunidad de confirmar esto "arreglar".

Por favor, acepte mis disculpas si he roto la etiqueta Stackoverflow por volver a publicar mi comentario como respuesta, pero decidí hacerlo por dos razones. En primer lugar porque, a pesar de que soy yo sobre el mismo asunto de nuevo, en mi humilde opinión esta nueva información parece proporcionar una "respuesta" totalmente diferente al problema. Y en segundo lugar, yo estaba preocupado de que el formulario de comentarios no podría llamar su atención antes de que hubieras pasado una gran cantidad de tiempo buscando en la primera respuesta que he proporcionado.

La próxima vez voy a pensar más cuidadosamente antes de actuar.

TL

Una forma de simplificar la necesidad de "hágalo usted mismo" podría ser el uso de consultas con parámetros:

   Query query = pm.newQuery(mytype.class);
   query.setFilter("field == autoParam");
   query.declareParameters("String autoParam");

   List<String> params = myListOfThingsFieldCanBeEqualTo;

   Set merged = new HashSet();
   for (String f : params) {
     merged.addAll(q.execute(f));
   }

A diferencia de respuesta de Cletus, O-ing obras , en la versión más reciente de App Engine de todos modos.

De hecho, me encontré con una OR de no trabajar en App Engine 1.3.0 que tenía, pero de acuerdo con Google App Engine - consultas e índices (Cletus la misma fuente se hace referencia en su respuesta),

  

Una entidad debe coincidir con todos los filtros a ser el resultado. En la sintaxis de cadena JDOQL, se puede separar varios filtros con || (Lógico "o") y && (lógico "y"), a pesar de tener en cuenta que || sólo puede ser empleada cuando los filtros que separa todos tienen el mismo nombre de campo. En otras palabras, || sólo es legal en situaciones en que los filtros que separa se pueden combinar en un solo contiene () filtros.

Pensé que ya su respuesta (y desde la última vez actualizado mi App Engine), App Engine debe haber sido actualizado en esta materia.

Actualización de App Engine a 1.3.4, y las obras O-ing! A pesar de la limitación.

Gracias a Cletus todos modos:)

Puede utilizar el método contains

String filters = "( :values.contains(field) )";
Query query = pm.newQuery(myType.class, filters);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top