2012-06-04 16 views
9

Proszę mi pomóc zrozumieć to:App Engine zawiera dziwny kod

Na v1.6.6 Jest to zgodne 2744 z 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) 
. 
. 
. 

Po one ograniczone parametr indeksowany się fałszywe - Oni ustaw to prawda!

+0

@kamens podziękować za hojność. +500, To pytanie prawdopodobnie cię bardzo niepokoiło :) – theosp

+0

Nie mogę wziąć kredytu, @alpert oferował nagrodę ... – kamens

Odpowiedz

4

Przed wersją 1.2.2 można było wykonywać kwerendy filtrów dla dowolnego typu właściwości, nawet tekstu i obiektu typu blob. Zwrócili tylko puste listy, ale zadziałało. Wersja 1.2.2 wprowadziła atrybut indexed dla właściwości, który umożliwia wyłączenie indeksowania wybranych właściwości [1]. Od tej pory właściwość, do której chcesz wysłać zapytanie, musi zostać zaindeksowana lub spowoduje zgłoszenie wyjątku.

Wiemy, że nie można indeksować właściwości Text i Blob. Nie zmieniając niczego innego, zapytania do tych właściwości powodowałyby zgłaszanie wyjątków od wersji 1.2.2 (których wcześniej nie robili). Aby nie wprowadzać regresji i nie łamać istniejących aplikacji, linia kwds['indexed'] = True została dodana do klasy UnindexedProperty.

Gdybyśmy mieli kontrolę nad wszystkimi zależnymi kodami, byłoby to czystsze rozwiązanie do rozpoczęcia zgłaszania wyjątku. Ale w świetle nie łamania istniejących aplikacji, zdecydowano się go załatać.

Można spróbować samemu zmieniając kwds['indexed'] = True do kwds['indexed'] = False i uruchomić ten fragment:

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

Ma sens, interesujący – kamens

+0

Tak więc UnindexedProperty po prostu wymusza, że ​​kod nie ustawia 'indexed = True 'ale czy zbudowałby indeks na własności (innej niż Text/Blob)? –

+0

(Przykładem dopasowania @ alpert's opis będzie ArrayProperty w aetycoon: https://github.com/Arachnid/aetycoon/blob/master/__init__.py) – kamens