Hallo Doug, Thank you for your feedback. I agree that implicitly using Order.IGNORE to ignore differences in records makes sense, as that is the criteria used to define distinction when sorting. But it looks as though only the schema name is checked when deciding whether to examine each field or not. This can, as the test below shows, result in a lack of symmetry when using equals if one is not careful (i.e. the example is a "bad" one as it's not a good idea to have two schemas with the same name and namespace yet with different contents, but shows how one might inadvertently make a wrong assumption about equality):-
@Test public void test() { Schema schema1 = Schema.createRecord("test_record", null, "my.namespace", false); List<Field> fields1 = new ArrayList<Field>(); fields1.add(new Field("attribute1", Schema.create(Schema.Type.STRING), null, null, Order.IGNORE)); schema1.setFields(fields1); Schema schema2 = Schema.createRecord("test_record", null, "my.namespace", false); List<Field> fields2 = new ArrayList<Field>(); fields2.add(new Field("attribute1", Schema.create(Schema.Type.STRING), null, null, Order.ASCENDING)); schema2.setFields(fields2); GenericRecord record1 = new GenericData.Record(schema1); record1.put("attribute1", "1"); GenericRecord record2 = new GenericData.Record(schema2); record2.put("attribute1", "2"); System.out.println(record1.equals(record2)); // returns TRUE System.out.println(record2.equals(record1)); // returns FALSE } Andrew >________________________________ > From: Doug Cutting <cutt...@apache.org> >To: user@avro.apache.org >Sent: Thursday, February 9, 2012 8:49 PM >Subject: Re: Does Avro GenericData.Record violate the .equals contract? > >On 02/09/2012 07:02 AM, Andrew Kenworthy wrote: >> This means that if I have no sorting defined in my schema, that all >> records are treated as being equal to one another. > >If you specify "order":"ignore" for all fields in a record, then, yes, >all instances of that record would be equal. I cannot imagine a case >where this would be useful, but I also don't see how this would violate >the equals() contract. > >The default for fields is to behave as if "order":"ascending" is >specified. Records are equal if all of their fields that are not >specified as "order":"ignore" are equal. > >Doug > > >