/** * * @param AvroSchema $writers_schema * @param AvroSchema $readers_schema * @return boolean true if the schemas are consistent with * each other and false otherwise. */ static function schemas_match($writers_schema, $readers_schema) { $writers_schema_type = $writers_schema->type; $readers_schema_type = $readers_schema->type; if (AvroSchema::UNION_SCHEMA == $writers_schema_type || AvroSchema::UNION_SCHEMA == $readers_schema_type) { return true; } if ($writers_schema_type == $readers_schema_type) { if (AvroSchema::is_primitive_type($writers_schema_type)) { return true; } switch ($readers_schema_type) { case AvroSchema::MAP_SCHEMA: return self::attributes_match($writers_schema->values(), $readers_schema->values(), array(AvroSchema::TYPE_ATTR)); case AvroSchema::ARRAY_SCHEMA: return self::attributes_match($writers_schema->items(), $readers_schema->items(), array(AvroSchema::TYPE_ATTR)); case AvroSchema::ENUM_SCHEMA: return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR)); case AvroSchema::FIXED_SCHEMA: return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR, AvroSchema::SIZE_ATTR)); case AvroSchema::RECORD_SCHEMA: case AvroSchema::ERROR_SCHEMA: return self::attributes_match($writers_schema, $readers_schema, array(AvroSchema::FULLNAME_ATTR)); case AvroSchema::REQUEST_SCHEMA: // XXX: This seems wrong return true; // XXX: no default } if (AvroSchema::INT_TYPE == $writers_schema_type && in_array($readers_schema_type, array(AvroSchema::LONG_TYPE, AvroSchema::FLOAT_TYPE, AvroSchema::DOUBLE_TYPE))) { return true; } if (AvroSchema::LONG_TYPE == $writers_schema_type && in_array($readers_schema_type, array(AvroSchema::FLOAT_TYPE, AvroSchema::DOUBLE_TYPE))) { return true; } if (AvroSchema::FLOAT_TYPE == $writers_schema_type && AvroSchema::DOUBLE_TYPE == $readers_schema_type) { return true; } return false; } }