Skip to content

Different Queries, same hashCodes #4032

Closed as not planned
Closed as not planned
@kusamau

Description

@kusamau

Consider two org.springframework.data.mongodb.core.query.Query instances almost identical except for one projection field which is

  • included in one query
  • excluded in the other query

then the following test fails

Assertions.assertNotEquals(queryWithExclude.hashCode(), queryWithInclude.hashCode());

Unit Test

    @Test
    public void hashMapQueryTest() {
        Query queryWithExclude = new Query();
        queryWithExclude.fields().exclude("key1");
        queryWithExclude.fields().exclude("key2");

        Query queryWithInclude = new Query();
        queryWithInclude.fields().include("key1");
        queryWithInclude.fields().include("key2");

        Assertions.assertNotEquals(queryWithExclude.hashCode(), queryWithInclude.hashCode());
    }

Comments
The problem can be drilled down to the Field.hashCode()

ObjectUtils.nullSafeHashCode(this.criteria);

which seems to fails due to the HashMap implementation itself as proved by the following test

    @Test
    public void hashMapZeroOneTest() {
        HashMap<String, Integer> fieldZero = new HashMap<>();
        fieldZero.put("key1", 0);
        fieldZero.put("key2", 0);

        HashMap<String, Integer> fieldOne = new HashMap<>();
        fieldOne.put("key1", 1);
        fieldOne.put("key2", 1);

        Assertions.assertNotEquals(fieldZero.hashCode(), fieldOne.hashCode());
    }

however tests with other numbers than 0 or 1 works.

To conclude, the problem seem related to the use of 0 and 1 in the Field.criteria which then are translated according to the mongo projection syntax. Possible solution could be to replace in the Field class 0/1 used by include/exclude with enum INCLUDE/EXCLUDE values and consequently modify up to various get[Query|Field]Object().

Comments?

Regards,
Maurizio

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions