anothr attempt to fix mongodb adapter

This commit is contained in:
Massimo Di Pierro
2012-05-10 15:12:29 -05:00
parent 25038d5398
commit a2ade9094c
2 changed files with 34 additions and 46 deletions

View File

@@ -1 +1 @@
Version 1.99.7 (2012-05-10 08:17:55) dev
Version 1.99.7 (2012-05-10 15:12:10) dev

View File

@@ -4623,30 +4623,19 @@ class MongoDBAdapter(NoSQLAdapter):
if orderby:
#print "in if orderby %s" % orderby
if isinstance(orderby, (list, tuple)):
print "in xorify"
orderby = xorify(orderby)
# !!!! need to add 'random'
for f in self.expand(orderby).split(','):
if f.startswith('-'):
mongosort_list.append((f[1:],-1))
else:
mongosort_list.append((f,1))
print "mongosort_list = %s" % mongosort_list
if limitby:
# a tuple
limitby_skip,limitby_limit = limitby
limitby_skip, limitby_limit = limitby
else:
limitby_skip = 0
limitby_limit = 0
#if distinct:
#print "in distinct %s" % distinct
limitby_skip = limitby_limit = 0
mongofields_dict = son.SON()
mongoqry_dict = {}
@@ -4662,52 +4651,51 @@ class MongoDBAdapter(NoSQLAdapter):
tablename = fields[0].tablename
else:
raise SyntaxError, "The table name could not be found in the query nor from the select statement."
fieldnames = [f for f in (fields or self.db[tablename])] # ie table.field
mongoqry_dict = self.expand(query)
for f in fieldnames:
mongofields_dict[f.name] = 1 # ie field=1
return tablename, mongoqry_dict, mongofields_dict, mongosort_list, limitby_limit, limitby_skip
fields = fields or self.db[tablename]
for field in fields:
mongofields_dict[field.name] = 1
return tablename, mongoqry_dict, mongofields_dict, \
mongosort_list, limitby_limit, limitby_skip
# need to define all the 'sql' methods gt,lt etc....
def select(self,query,fields,attributes,count=False,snapshot=False):
withId=False
tablename, mongoqry_dict , mongofields_dict, mongosort_list, limitby_limit, limitby_skip = self._select(query,fields,attributes)
for key in mongofields_dict.keys():
if key == 'id':
withId = True
break
try:
print "mongoqry_dict=%s" % mongoqry_dict
except:
pass
print "mongofields_dict=%s" % mongofields_dict
tablename, mongoqry_dict, mongofields_dict,
mongosort_list, limitby_limit, limitby_skip = \
self._select(query,fields,attributes)
ctable = self.connection[tablename]
if count:
return {'count' : ctable.find(mongoqry_dict,mongofields_dict,
skip=limitby_skip, limit=limitby_limit,
sort=mongosort_list,snapshot=snapshot).count()}
return {'count' : ctable.find(
mongoqry_dict, mongofields_dict,
skip=limitby_skip, limit=limitby_limit,
sort=mongosort_list, snapshot=snapshot).count()}
else:
mongo_list_dicts = ctable.find(mongoqry_dict,mongofields_dict,
skip=limitby_skip, limit=limitby_limit,
sort=mongosort_list,snapshot=snapshot) # pymongo cursor object
mongo_list_dicts = ctable.find(
mongoqry_dict, mongofields_dict,
skip=limitby_skip, limit=limitby_limit,
sort=mongosort_list, snapshot=snapshot) # pymongo cursor object
print "mongo_list_dicts=%s" % mongo_list_dicts
rows = []
colnames = []
### populate row in proper order
if mongo_list_dicts:
def fix(id): return 'id' if id=='_id' else id
colnames = [fix(column) for column in mongo_list_dicts[0]]
else:
colnames = []
for k,record in enumerate(mongo_list_dicts):
row=[]
for column in record:
if k==0:
colnames.append(column)
if withId and (column == '_id'):
if isinstance(record[column],pymongo.objectid.ObjectId):
row.append( int(str(record[column]),16))
else:
#in case of alternative key
row.append( record[column] )
elif not (column == '_id'):
row.append(record[column])
if column == '_id' and \
isinstance(record[column],pymongo.objectid.ObjectId):
value = int(str(record[column]),16)
elif column != '_id':
value = record[column]
row.append(value)
rows.append(row)
table = self.db[tablename]
fields = [table[colname] for colname in colnames]
processor = attributes.get('processor',self.parse)
return processor(rows,fields,colnames,False)