2012-06-04 12 views
9

Por favor, ayuda a entender esto:App Engine contiene código extraño

En v1.6.6 está en línea 2744 de google/appengine/ext/db/__init__.py:

class UnindexedProperty(Property): 
    """A property that isn't indexed by either built-in or composite indices. 

    TextProperty and BlobProperty derive from this class. 
    """ 
    def __init__(self, *args, **kwds): 
    """Construct property. See the Property class for details. 

    Raises: 
     ConfigurationError if indexed=True. 
    """ 
    self._require_parameter(kwds, 'indexed', False) 



    kwds['indexed'] = True 
    super(UnindexedProperty, self).__init__(*args, **kwds) 
. 
. 
. 

Después de que constreñidos parámetro indexado a ser falsa - Establecen que a la verdad!

+0

@kamens gracias por la generosidad. +500, Esta pregunta probablemente realmente te molestó :) – theosp

+0

No puedo creerme, @alpert ofreció la recompensa ... – kamens

Respuesta

4

Antes de 1.2.2, podría hacer consultas de filtro para cualquier tipo de propiedad, incluso Texto y Blob. Solo devolvieron listas vacías, pero funcionó. La versión 1.2.2 introdujo el atributo indexed para propiedades que le permite desactivar la indexación de propiedades seleccionadas [1]. Desde entonces, la propiedad que desea consultar debe indexarse ​​o emitirá una excepción.

Sabemos que las propiedades Texto y Blob no se pueden indexar. Sin cambiar nada más, las consultas sobre esas propiedades generarían excepciones desde 1.2.2 en adelante (lo que no ocurría antes). Para no introducir una regresión y romper las aplicaciones existentes, se agregó la línea kwds['indexed'] = True a la clase UnindexedProperty.

Si tuviéramos control sobre todo el código dependiente, habría sido una solución más limpia comenzar a generar una excepción. Pero a la luz de no romper las aplicaciones existentes, se decidió parchearlo.

Puede hacerlo por uno mismo, cambiando kwds['indexed'] = True-kwds['indexed'] = False y ejecutar este fragmento:

from google.appengine.ext import db 

class TestModel(db.Model): 
    text = db.TextProperty() 

TestModel(text='foo').put() 
print TestModel.all().filter('text =', 'foo').fetch(10) 

[1] http://code.google.com/p/googleappengine/source/browse/trunk/python/RELEASE_NOTES#1165

+0

Tiene sentido, interesante – kamens

+0

Así que UnindexedProperty simplemente exige que el código no establezca 'indexed = True 'pero ¿crearía un índice en una propiedad (sin texto/blob)? –

+0

(Un ejemplo que coincida con la descripción de @ alpert sería ArrayProperty en aetycoon: https://github.com/Arachnid/aetycoon/blob/master/__init__.py) – kamens