fixed issue 1143, grid/smartgrid GAE improvements, thanks Howesc
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.2.1 (2012-11-08 10:04:19) stable
|
Version 2.2.1 (2012-11-08 10:05:43) stable
|
||||||
|
|||||||
+2
-2
@@ -4588,7 +4588,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
processor = attributes.get('processor',self.parse)
|
processor = attributes.get('processor',self.parse)
|
||||||
return processor(rows,fields,colnames,False)
|
return processor(rows,fields,colnames,False)
|
||||||
|
|
||||||
def count(self,query,distinct=None):
|
def count(self,query,distinct=None,limit=None):
|
||||||
if distinct:
|
if distinct:
|
||||||
raise RuntimeError("COUNT DISTINCT not supported")
|
raise RuntimeError("COUNT DISTINCT not supported")
|
||||||
(items, tablename, fields) = self.select_raw(query)
|
(items, tablename, fields) = self.select_raw(query)
|
||||||
@@ -4596,7 +4596,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
try:
|
try:
|
||||||
return len(items)
|
return len(items)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
return items.count(limit=None)
|
return items.count(limit=limit)
|
||||||
|
|
||||||
def delete(self,tablename, query):
|
def delete(self,tablename, query):
|
||||||
"""
|
"""
|
||||||
|
|||||||
+60
-14
@@ -2017,6 +2017,9 @@ class SQLFORM(FORM):
|
|||||||
c = 'count(*)'
|
c = 'count(*)'
|
||||||
nrows = dbset.select(c, left=left, cacheable=True,
|
nrows = dbset.select(c, left=left, cacheable=True,
|
||||||
groupby=groupby).first()[c]
|
groupby=groupby).first()[c]
|
||||||
|
elif dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
#if we don't set a limit, this can timeout for a large table
|
||||||
|
nrows = dbset.db._adapter.count(dbset.query, limit=1000)
|
||||||
else:
|
else:
|
||||||
nrows = dbset.count()
|
nrows = dbset.count()
|
||||||
except:
|
except:
|
||||||
@@ -2078,8 +2081,64 @@ class SQLFORM(FORM):
|
|||||||
|
|
||||||
head = TR(*headcols, _class=ui.get('header'))
|
head = TR(*headcols, _class=ui.get('header'))
|
||||||
|
|
||||||
|
cursor = True
|
||||||
|
#figure out what page we are one to setup the limitby
|
||||||
|
if paginate and dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
cursor = request.vars.cursor or True
|
||||||
|
limitby = (0, paginate)
|
||||||
|
try: page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError: page = 0
|
||||||
|
elif paginate and paginate<nrows:
|
||||||
|
try: page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError: page = 0
|
||||||
|
limitby = (paginate*page,paginate*(page+1))
|
||||||
|
else:
|
||||||
|
limitby = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
table_fields = [f for f in fields if f._tablename in tablenames]
|
||||||
|
if dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
rows = dbset.select(left=left,orderby=orderby,
|
||||||
|
groupby=groupby,limitby=limitby,
|
||||||
|
reusecursor=cursor,
|
||||||
|
cacheable=True,*table_fields)
|
||||||
|
next_cursor = dbset._db.get('_lastcursor', None)
|
||||||
|
else:
|
||||||
|
rows = dbset.select(left=left,orderby=orderby,
|
||||||
|
groupby=groupby,limitby=limitby,
|
||||||
|
cacheable=True,*table_fields)
|
||||||
|
except SyntaxError:
|
||||||
|
rows = None
|
||||||
|
next_cursor = None
|
||||||
|
error = T("Query Not Supported")
|
||||||
|
except Exception, e:
|
||||||
|
rows = None
|
||||||
|
next_cursor = None
|
||||||
|
error = T("Query Not Supported: %s")%e
|
||||||
|
|
||||||
|
message = error
|
||||||
|
if not message and nrows:
|
||||||
|
if dbset._db._adapter.dbengine=='google:datastore' and nrows>=1000:
|
||||||
|
message = T('at least %(nrows)s records found') % dict(nrows=nrows)
|
||||||
|
else:
|
||||||
|
message = T('%(nrows)s records found') % dict(nrows=nrows)
|
||||||
|
console.append(DIV(message,_class='web2py_counter'))
|
||||||
|
|
||||||
paginator = UL()
|
paginator = UL()
|
||||||
if paginate and paginate < nrows:
|
if paginate and dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
#this means we may have a large table with an unknown number of rows.
|
||||||
|
try:
|
||||||
|
page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError:
|
||||||
|
page = 0
|
||||||
|
paginator.append(LI('page %s'%(page+1)))
|
||||||
|
if next_cursor:
|
||||||
|
d = dict(page=page+2, cursor=next_cursor)
|
||||||
|
if order: d['order']=order
|
||||||
|
if request.vars.keywords: d['keywords']=request.vars.keywords
|
||||||
|
paginator.append(LI(
|
||||||
|
A('next',_href=url(vars=d),_class=trap_class())))
|
||||||
|
elif paginate and paginate<nrows:
|
||||||
npages, reminder = divmod(nrows, paginate)
|
npages, reminder = divmod(nrows, paginate)
|
||||||
if reminder:
|
if reminder:
|
||||||
npages += 1
|
npages += 1
|
||||||
@@ -2087,7 +2146,6 @@ class SQLFORM(FORM):
|
|||||||
page = int(request.vars.page or 1) - 1
|
page = int(request.vars.page or 1) - 1
|
||||||
except ValueError:
|
except ValueError:
|
||||||
page = 0
|
page = 0
|
||||||
limitby = (paginate * page, paginate * (page + 1))
|
|
||||||
|
|
||||||
def self_link(name, p):
|
def self_link(name, p):
|
||||||
d = dict(page=p + 1)
|
d = dict(page=p + 1)
|
||||||
@@ -2115,18 +2173,6 @@ class SQLFORM(FORM):
|
|||||||
else:
|
else:
|
||||||
limitby = None
|
limitby = None
|
||||||
|
|
||||||
try:
|
|
||||||
table_fields = [f for f in fields if f._tablename in tablenames]
|
|
||||||
rows = dbset.select(left=left, orderby=orderby,
|
|
||||||
groupby=groupby, limitby=limitby,
|
|
||||||
*table_fields)
|
|
||||||
except SyntaxError:
|
|
||||||
rows = None
|
|
||||||
error = T("Query Not Supported")
|
|
||||||
if nrows:
|
|
||||||
message = error or T('%(nrows)s records found') % dict(nrows=nrows)
|
|
||||||
console.append(DIV(message, _class='web2py_counter'))
|
|
||||||
|
|
||||||
if rows:
|
if rows:
|
||||||
htmltable = TABLE(THEAD(head))
|
htmltable = TABLE(THEAD(head))
|
||||||
tbody = TBODY()
|
tbody = TBODY()
|
||||||
|
|||||||
Reference in New Issue
Block a user