Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
5 changes: 5 additions & 0 deletions docs/changelog/131817.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 131817
summary: Change equals and hashcode for `ConstantNullBlock`
area: ES|QL
type: bug
issues: []
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import org.elasticsearch.core.ReleasableIterator;

import java.io.IOException;
import java.util.Objects;

/**
* Block implementation representing a constant null value.
Expand Down Expand Up @@ -120,15 +119,23 @@ public long ramBytesUsed() {

@Override
public boolean equals(Object obj) {
if (obj instanceof ConstantNullBlock that) {
return this.getPositionCount() == that.getPositionCount();
if (obj instanceof Block that) {
return this.getPositionCount() == 0 && that.getPositionCount() == 0
|| this.getPositionCount() == that.getPositionCount() && that.areAllValuesNull();
}
if (obj instanceof Vector that) {
return this.getPositionCount() == 0 && that.getPositionCount() == 0;
}
return false;
}

@Override
public int hashCode() {
return Objects.hash(getPositionCount());
int result = 1;
for (int pos = 0; pos < positionCount; pos++) {
result = 31 * result - 1;
}
return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ public void testEmptyBlock() {
blockFactory.newConstantBooleanBlockWith(randomBoolean(), 0),
blockFactory.newBooleanBlockBuilder(0).build(),
blockFactory.newBooleanBlockBuilder(0).appendBoolean(randomBoolean()).build().filter(),
blockFactory.newBooleanBlockBuilder(0).appendNull().build().filter()
blockFactory.newBooleanBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
}
Expand Down Expand Up @@ -252,6 +253,28 @@ public void testBlockInequality() {
assertAllNotEquals(notEqualBlocks);
}

public void testSimpleBlockWithManyNulls() {
int positions = randomIntBetween(1, 256);
boolean grow = randomBoolean();
BooleanBlock.Builder builder1 = blockFactory.newBooleanBlockBuilder(grow ? 0 : positions);
BooleanBlock.Builder builder2 = blockFactory.newBooleanBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
BooleanBlock block1 = builder1.build();
BooleanBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

static void assertAllEquals(List<?> objs) {
for (Object obj1 : objs) {
for (Object obj2 : objs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ public void testEmptyBlock() {
blockFactory.newConstantBytesRefBlockWith(new BytesRef(), 0),
blockFactory.newBytesRefBlockBuilder(0).build(),
blockFactory.newBytesRefBlockBuilder(0).appendBytesRef(new BytesRef()).build().filter(),
blockFactory.newBytesRefBlockBuilder(0).appendNull().build().filter()
blockFactory.newBytesRefBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
}
Expand Down Expand Up @@ -357,17 +358,20 @@ public void testSimpleBlockWithManyNulls() {
boolean grow = randomBoolean();
BytesRefBlock.Builder builder1 = blockFactory.newBytesRefBlockBuilder(grow ? 0 : positions);
BytesRefBlock.Builder builder2 = blockFactory.newBytesRefBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
BytesRefBlock block1 = builder1.build();
BytesRefBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<BytesRefBlock> blocks = List.of(block1, block2);
List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ public void testEmptyBlock() {
blockFactory.newConstantDoubleBlockWith(0, 0),
blockFactory.newDoubleBlockBuilder(0).build(),
blockFactory.newDoubleBlockBuilder(0).appendDouble(1).build().filter(),
blockFactory.newDoubleBlockBuilder(0).appendNull().build().filter()
blockFactory.newDoubleBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
Releasables.close(blocks);
Expand Down Expand Up @@ -234,17 +235,20 @@ public void testSimpleBlockWithManyNulls() {
boolean grow = randomBoolean();
DoubleBlock.Builder builder1 = blockFactory.newDoubleBlockBuilder(grow ? 0 : positions);
DoubleBlock.Builder builder2 = blockFactory.newDoubleBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
DoubleBlock block1 = builder1.build();
DoubleBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<DoubleBlock> blocks = List.of(block1, block2);
List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ public void testEmptyBlock() {
blockFactory.newConstantFloatBlockWith(0, 0),
blockFactory.newFloatBlockBuilder(0).build(),
blockFactory.newFloatBlockBuilder(0).appendFloat(1).build().filter(),
blockFactory.newFloatBlockBuilder(0).appendNull().build().filter()
blockFactory.newFloatBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
Releasables.close(blocks);
Expand Down Expand Up @@ -234,17 +235,20 @@ public void testSimpleBlockWithManyNulls() {
boolean grow = randomBoolean();
FloatBlock.Builder builder1 = blockFactory.newFloatBlockBuilder(grow ? 0 : positions);
FloatBlock.Builder builder2 = blockFactory.newFloatBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
FloatBlock block1 = builder1.build();
FloatBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<FloatBlock> blocks = List.of(block1, block2);
List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ public void testEmptyBlock() {
blockFactory.newConstantIntBlockWith(0, 0),
blockFactory.newIntBlockBuilder(0).build(),
blockFactory.newIntBlockBuilder(0).appendInt(1).build().filter(),
blockFactory.newIntBlockBuilder(0).appendNull().build().filter()
blockFactory.newIntBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
}
Expand Down Expand Up @@ -203,17 +204,20 @@ public void testSimpleBlockWithManyNulls() {
boolean grow = randomBoolean();
IntBlock.Builder builder1 = blockFactory.newIntBlockBuilder(grow ? 0 : positions);
IntBlock.Builder builder2 = blockFactory.newIntBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
IntBlock block1 = builder1.build();
IntBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<IntBlock> blocks = List.of(block1, block2);
List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ public void testEmptyBlock() {
blockFactory.newConstantLongBlockWith(0, 0),
blockFactory.newLongBlockBuilder(0).build(),
blockFactory.newLongBlockBuilder(0).appendLong(1).build().filter(),
blockFactory.newLongBlockBuilder(0).appendNull().build().filter()
blockFactory.newLongBlockBuilder(0).appendNull().build().filter(),
(ConstantNullBlock) blockFactory.newConstantNullBlock(0)
);
assertAllEquals(blocks);
}
Expand Down Expand Up @@ -201,17 +202,20 @@ public void testSimpleBlockWithManyNulls() {
boolean grow = randomBoolean();
LongBlock.Builder builder1 = blockFactory.newLongBlockBuilder(grow ? 0 : positions);
LongBlock.Builder builder2 = blockFactory.newLongBlockBuilder(grow ? 0 : positions);
ConstantNullBlock.Builder builder3 = new ConstantNullBlock.Builder(blockFactory);
for (int p = 0; p < positions; p++) {
builder1.appendNull();
builder2.appendNull();
builder3.appendNull();
}
LongBlock block1 = builder1.build();
LongBlock block2 = builder2.build();
Block block3 = builder3.build();
assertEquals(positions, block1.getPositionCount());
assertTrue(block1.mayHaveNulls());
assertTrue(block1.isNull(0));

List<LongBlock> blocks = List.of(block1, block2);
List<Block> blocks = List.of(block1, block2, block3);
assertAllEquals(blocks);
}

Expand Down
Loading