in Labs/amazon-rds-purpose-built-workshop/src/ddb-python-script/util.py [0:0]
def updateTripInfo(newInfo, expectedTripStatus = None):
key = {
'riderid': newInfo['riderid'],
'tripinfo':newInfo['tripinfo'],
}
updateExp = "SET "
expAttrNames={
"#st": "STATUS"
}
updateExp += "#st = :s, "
newItem = {
':s': newInfo['Status']
}
if(expectedTripStatus is None):
conditionalExp = "attribute_not_exists(#st)"
else:
newItem.update({":ps": expectedTripStatus})
conditionalExp = "#st=:ps"
if "RIDER_ID" in newInfo:
updateExp += "RIDER_ID = :rid, "
newItem.update({":rid": newInfo['RIDER_ID']})
if 'RIDER_MOBILE' in newInfo:
updateExp += "RIDER_MOBILE = :rm, "
newItem.update({":rm": newInfo['RIDER_MOBILE']})
if 'PICKUP_DATETIME' in newInfo:
updateExp += "PICKUP_DATETIME = :pdt, "
newItem.update({":pdt": newInfo['PICKUP_DATETIME']})
if 'RIDER_NAME' in newInfo:
updateExp += "RIDER_NAME = :rn, "
newItem.update({":rn" : newInfo['RIDER_NAME']})
if 'VENDOR_ID' in newInfo:
updateExp += "VENDOR_ID = :vid, "
newItem.update({":vid" : newInfo['VENDOR_ID']})
if 'PICKUP_LONGITUDE' in newInfo:
updateExp += "PICKUP_LONGITUDE = :pickLong, "
newItem.update({":pickLong" : decimal.Decimal(newInfo['PICKUP_LONGITUDE'])})
if 'TRIP_TYPE' in newInfo:
updateExp += "TRIP_TYPE = :tt, "
newItem.update({":tt" : newInfo['TRIP_TYPE']})
if 'STORE_AND_FWD_FLAG' in newInfo:
updateExp += "STORE_AND_FWD_FLAG = :saf, "
newItem.update({":saf" : newInfo['STORE_AND_FWD_FLAG']})
if 'DROPOFF_LATITUDE' in newInfo:
updateExp += "DROPOFF_LATITUDE = :dropLat, "
newItem.update({":dropLat" : decimal.Decimal(newInfo['DROPOFF_LATITUDE'])})
if 'RATE_CODE_ID' in newInfo:
updateExp += "RATE_CODE_ID = :rcid, "
newItem.update({":rcid" : newInfo['RATE_CODE_ID']})
if 'TOLLS_AMOUNT' in newInfo:
updateExp += "TOLLS_AMOUNT = :tllamt, "
newItem.update({":tllamt" : decimal.Decimal(newInfo['TOLLS_AMOUNT'])})
if 'IMPROVEMENT_SURCHARGE' in newInfo:
updateExp += "IMPROVEMENT_SURCHARGE = :isc, "
newItem.update({":isc" : decimal.Decimal(newInfo['IMPROVEMENT_SURCHARGE'])})
if 'TIP_AMOUNT' in newInfo:
updateExp += "TIP_AMOUNT = :tpamt, "
newItem.update({":tpamt" : decimal.Decimal(newInfo['TIP_AMOUNT'])})
if 'DROPOFF_DATETIME' in newInfo:
updateExp += "DROPOFF_DATETIME = :drpdt, "
newItem.update({":drpdt" : newInfo['DROPOFF_DATETIME']})
if 'CAB_TYPE_ID' in newInfo:
updateExp += "CAB_TYPE_ID = :ctid, "
newItem.update({":ctid" : newInfo['CAB_TYPE_ID']})
if 'DRIVER_NAME' in newInfo:
updateExp += "DRIVER_NAME = :dn, "
newItem.update({":dn" : newInfo['DRIVER_NAME']})
if 'PICKUP_LATITUDE' in newInfo:
updateExp += "PICKUP_LATITUDE = :pickLat, "
newItem.update({":pickLat" : decimal.Decimal(newInfo['PICKUP_LATITUDE'])})
if 'TRIP_DISTANCE' in newInfo:
updateExp += "TRIP_DISTANCE = :trpDist, "
newItem.update({":trpDist" : decimal.Decimal(newInfo['TRIP_DISTANCE'])})
if 'VEHICLE_ID' in newInfo:
updateExp += "VEHICLE_ID = :vhid, "
newItem.update({":vhid" : newInfo['VEHICLE_ID']})
if 'TOTAL_AMOUNT' in newInfo:
updateExp += "TOTAL_AMOUNT = :tamt, "
newItem.update({":tamt" : decimal.Decimal(newInfo['TOTAL_AMOUNT'])})
if 'MTA_TAX' in newInfo:
updateExp += "MTA_TAX = :mtax, "
newItem.update({":mtax" : decimal.Decimal(newInfo['MTA_TAX'])})
if 'DROPOFF_LONGITUDE' in newInfo:
updateExp += "DROPOFF_LONGITUDE = :dropLong, "
newItem.update({":dropLong" : decimal.Decimal(newInfo['DROPOFF_LONGITUDE'])})
if 'PAYMENT_TYPET' in newInfo:
updateExp += "PAYMENT_TYPET = :pmtt, "
newItem.update({":pmtt" : newInfo['PAYMENT_TYPET']})
if 'DRIVER_ID' in newInfo:
updateExp += "DRIVER_ID = :did, "
newItem.update({":did" : int(newInfo['DRIVER_ID'])})
if 'DRIVER_EMAIL' in newInfo:
updateExp += "DRIVER_EMAIL = :de, "
newItem.update({":de" : newInfo['DRIVER_EMAIL']})
updateExp += "driverid = :drid, "
newItem.update({":drid" : newInfo['DRIVER_EMAIL']})
if 'EXTRA' in newInfo:
updateExp += "EXTRA = :ext, "
newItem.update({":ext" : decimal.Decimal(newInfo['EXTRA'])})
if 'FARE_AMOUNT' in newInfo:
updateExp += "FARE_AMOUNT = :famt, "
newItem.update({":famt" : decimal.Decimal(newInfo['FARE_AMOUNT'])})
if 'PASSENGER_COUNT' in newInfo:
updateExp += "PASSENGER_COUNT = :psgCnt, "
newItem.update({":psgCnt" : newInfo['PASSENGER_COUNT']})
if 'RIDER_EMAIL' in newInfo:
updateExp+= "RIDER_EMAIL = :re, "
newItem.update({":re" : newInfo['RIDER_EMAIL']})
if 'DRIVER_MOBILE' in newInfo:
updateExp+= "DRIVER_MOBILE = :dm, "
newItem.update({":dm" : newInfo['DRIVER_MOBILE']})
if 'tripinfo' in newInfo:
updateExp += "ID = :id, "
newItem.update({":id" : int(newInfo['tripinfo'].split(',')[1])})
if 'DriverDetails' in newInfo:
updateExp += "DriverDetails = :ddet, "
newItem.update({":ddet" : json.dumps(newInfo['DriverDetails'], indent=2, cls=DecimalEncoder)})
# Remove last 2 charectors , and space from the update expression
updateExp = updateExp[:-2]
print("Key= " + json.dumps(key, indent=2))
print("UpdateExpression= " + updateExp)
print ("ConditionExpression = " + conditionalExp)
print ("ExpressionAttributeValues= " + json.dumps(newItem, indent=2, cls=DecimalEncoder))
try:
response = table.update_item(
Key = key,
UpdateExpression = updateExp,
ExpressionAttributeValues = newItem,
ExpressionAttributeNames = expAttrNames,
ConditionExpression = conditionalExp,
ReturnValues = "ALL_NEW"
)
print("UpdateItem succeeded...Response = " + json.dumps(response, indent=4, cls=DecimalEncoder))
return response
except ClientError as e:
if e.response['Error']['Code'] == "ConditionalCheckFailedException":
print("UpdateItem Item Error. Conditional check failed =" + e.response['Error']['Message'])
raise