Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lucene/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,8 @@ Other

* GITHUB#16215: Extract segment-boundary check into helper in QueryUtils (Luca Cavanna)

* GITHUB#16261: Fix CharArraySet equals/hashCode to be content-based and incorporate ignoreCase. (Mayya Sharipova)

======================= Lucene 10.4.0 =======================

API Changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ public CharArrayMap(int startSize, boolean ignoreCase) {
values = (V[]) new Object[size];
}

/** Returns {@code true} if this map matches keys case-insensitively. */
public boolean isIgnoreCase() {
return ignoreCase;
}

/**
* Creates a map from the mappings in another map.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.apache.lucene.analysis;

import java.util.AbstractSet;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
Expand Down Expand Up @@ -166,6 +167,31 @@ public Iterator<Object> iterator() {
return map.originalKeySet().iterator();
}

/** Returns {@code true} if this set matches entries case-insensitively. */
public boolean isIgnoreCase() {
return map.isIgnoreCase();
}

@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof CharArraySet other)) return false;
if (isIgnoreCase() != other.isIgnoreCase()) return false;
if (size() != other.size()) return false;
return containsAll(other);
}

@Override
public int hashCode() {
int h = Boolean.hashCode(isIgnoreCase());
for (char[] key : map.keys) {
if (key != null) {
h += Arrays.hashCode(key);
}
}
Comment thread
mayya-sharipova marked this conversation as resolved.
return h;
}
Comment thread
mayya-sharipova marked this conversation as resolved.
Comment thread
mayya-sharipova marked this conversation as resolved.

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("[");
Expand All @@ -177,6 +203,7 @@ public String toString() {
sb.append(item);
}
}
return sb.append(']').toString();
sb.append("](ignoreCase=").append(isIgnoreCase()).append(')');
return sb.toString();
Comment thread
mayya-sharipova marked this conversation as resolved.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ public void testModifyOnUnmodifiable() {

public void testToString() {
CharArrayMap<Integer> cm = new CharArrayMap<>(Collections.singletonMap("test", 1), false);
assertEquals("[test]", cm.keySet().toString());
assertEquals("[test](ignoreCase=false)", cm.keySet().toString());
assertEquals("[1]", cm.values().toString());
assertEquals("[test=1]", cm.entrySet().toString());
assertEquals("{test=1}", cm.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -373,8 +373,34 @@ public void testContainsWithNull() {

public void testToString() {
CharArraySet set = CharArraySet.copy(Collections.singleton("test"));
assertEquals("[test]", set.toString());
assertEquals("[test](ignoreCase=false)", set.toString());
Comment thread
mayya-sharipova marked this conversation as resolved.
set.add("test2");
assertTrue(set.toString().contains(", "));

CharArraySet ignoreCase = new CharArraySet(Collections.singleton("test"), true);
assertEquals("[test](ignoreCase=true)", ignoreCase.toString());
}

public void testEqualsAndHashCode_sameContentSameIgnoreCase() {
for (boolean ignoreCase : new boolean[] {false, true}) {
CharArraySet a = new CharArraySet(Arrays.asList(TEST_STOP_WORDS), ignoreCase);
CharArraySet b = new CharArraySet(Arrays.asList(TEST_STOP_WORDS), ignoreCase);
assertNotSame(a, b);
assertEquals(a, b);
assertEquals(a.hashCode(), b.hashCode());
}
}
Comment thread
mayya-sharipova marked this conversation as resolved.

public void testEqualsAndHashCode_sameContentDifferentIgnoreCase() {
CharArraySet sensitive = new CharArraySet(Arrays.asList("hund", "katze"), false);
CharArraySet insensitive = new CharArraySet(Arrays.asList("hund", "katze"), true);
assertNotEquals(sensitive, insensitive);
assertNotEquals(sensitive.hashCode(), insensitive.hashCode());
}

public void testEqualsAndHashCode_differentContent() {
CharArraySet a = new CharArraySet(Arrays.asList("hund"), false);
CharArraySet b = new CharArraySet(Arrays.asList("katze"), false);
assertNotEquals(a, b);
}
}