 			return "\(key) matches \(matchKey) from \(inQuery.className) where \(inQuery.whereClause())"
 		case .DoNotMatchQuery(let key, let dontMatchKey, let inQuery, let search):
 			return "\(key) doesn't match \(dontMatchKey) from \(inQuery.className) where \(inQuery.whereClause())"
+		case .RelatedTo(let key, let className, let objectId):
+			return "related to \(className) \(objectId) under key \(key)"
 		}
 	}
 }

		}
	}
	
	public static func login(username: String, password: String, callback: (User?, NSError?) -> Void) {
		parseRequest(.GET, "/login", ["username": username, "password": password]) { (json, error) in
			if error != nil {
				return callback(nil, error)
			}
			NSUserDefaults.standardUserDefaults().setObject(json.object, forKey: "user")
			NSUserDefaults.standardUserDefaults().synchronize()
			println("login user \(json)")
			callback(User(json), error)
		}
	}
	
	public static func signup(username: String, password: String, extraInfo: [String: AnyObject]? = nil, callback: (User?, NSError?) -> Void) {
		var param: [String: AnyObject] = ["username": username, "password": password]
		if var info = extraInfo {
			for (k, v) in info {

						return a[order] < b[order]
					})
					
					if results.count > query._limit {
						results = Array(results[0..<query._limit])
					}
				}
				
