def checkJoins(self, joins, allAttributes, cachedLHS, cachedRHS): for join in joins: if join.joinMethod == 'hash': lhsCheck = join.lhsKeySchema.fields # This is a list rhsCheck = join.rhsKeySchema.fields # This is a list joinAttr = lhsCheck + rhsCheck contains = all(x in allAttributes for x in joinAttr) and any( y in cachedRHS.schema().fields for y in joinAttr) # print(lhsCheck, rhsCheck, contains) if contains: keySchema1 = DBSchema('keyschema1', [(lhsCheck[0], 'int')]) keySchema2 = DBSchema('keyschema2', [(rhsCheck[0], 'int')]) hashFn1 = 'hash(' + lhsCheck[0] + ') % 7' hashFn2 = 'hash(' + rhsCheck[0] + ') % 7' joinExpr = lhsCheck[0] + ' == ' + rhsCheck[0] if lhsCheck[0] in cachedLHS.schema().fields: return True, { 'joinMethod': 'hash', 'lhsHashFn': hashFn1, 'lhsKeySchema': keySchema1, 'rhsHashFn': hashFn2, 'rhsKeySchema': keySchema2, 'joinExpr': joinExpr } else: return True, { 'joinMethod': 'hash', 'lhsHashFn': hashFn2, 'lhsKeySchema': keySchema2, 'rhsHashFn': hashFn1, 'rhsKeySchema': keySchema1, 'joinExpr': joinExpr } elif join.joinExpr: joinAttr = ExpressionInfo(join.joinExpr).getAttributes() contains = all(x in allAttributes for x in joinAttr) if contains: joinAttr1 = joinAttr.pop() joinAttr2 = joinAttr.pop() try: joinAttr.pop() except KeyError: pass # print('There are only two attributes in this, as expected') keySchema1 = DBSchema('keySchema1', [([joinAttr1, 'int'])]) keySchema2 = DBSchema('keySchema1', [([joinAttr2, 'int'])]) hashFn1 = 'hash(' + joinAttr1 + ') % 7' hashFn2 = 'hash(' + joinAttr2 + ') % 7' joinExpr = join.joinExpr if joinAttr1 in cachedLHS.schema().fields: return True, { 'joinMethod': 'hash', 'lhsHashFn': hashFn1, 'lhsKeySchema': keySchema1, 'rhsHashFn': hashFn2, 'rhsKeySchema': keySchema2, 'joinExpr': joinExpr } else: return True, { 'joinMethod': 'hash', 'lhsHashFn': hashFn2, 'lhsKeySchema': keySchema2, 'rhsHashFn': hashFn1, 'rhsKeySchema': keySchema1, 'joinExpr': joinExpr } else: return False, None