added a MRJob that does hard constraint matching