def create_or_update(cls, connection, **values):
        """Create or Update an activity row in 'activity_goal' table

        :param connection: DB connection object
        :param values: activity_goal payload
            {
                'user_id': <user-id>,
                'goal_id': <goal-id>,
            }
        :return: boolean output
        """
        session = connection.SESSION
        create_or_update = True
        try:
            activity_obj = session.query(schema.ActivityGoal).filter_by(**values).one()
            goal_count = Goal.get(connection, values.get(GOAL_ID_KEY)).get(COUNT_KEY)

            if goal_count < activity_obj.frequency + 1:
                raise Exception("Reached the required goal count")

            setattr(activity_obj, FREQUENCY_KEY, activity_obj.frequency + 1)
            completed_on = literal_eval(activity_obj.completed_on)
            completed_on[str(activity_obj.frequency)] = get_utc_time().strftime(TIME_FORMAT)
            setattr(activity_obj, COMPLETED_ON_KEY, completed_on)
            setattr(activity_obj, LAST_UPDATED_AT_KEY, get_utc_time())

            if goal_count == activity_obj.frequency:
                setattr(activity_obj, COMPLETED_KEY, True)
            session.commit()
        except NoResultFound as _:
            values[COMPLETED_ON_KEY] = dict([(str(1), get_utc_time().strftime(TIME_FORMAT))])
            session.add(schema.ActivityGoal(**values))
            session.commit()
        except Exception as e:
            print "Exception occurred during querying (INSERT/UPDATE) the activity_goal table: %s" % e
            session.rollback()
            create_or_update = False
        finally:
            session.close()
        return create_or_update