Skip to content

Commit 61ebf7c

Browse files
Merge branch 'develop' into ji/sub-segment-read
2 parents 13d686a + d352612 commit 61ebf7c

53 files changed

Lines changed: 2234 additions & 289 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/bench.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838
&& format('runs-on={0}/runner=bench-dedicated/extras=s3-cache/tag={1}', github.run_id, matrix.benchmark.id)
3939
|| 'ubuntu-latest' }}
4040
strategy:
41+
fail-fast: false
4142
matrix:
4243
benchmark:
4344
- id: random-access-bench

java/vortex-jni/src/main/java/dev/vortex/api/Expression.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ interface Visitor<T> {
9595
*/
9696
T visitIsNull(IsNull isNull);
9797

98+
/**
99+
* Visits an is not null expression (non-null check).
100+
*
101+
* @param isNotNull the is not null expression to visit
102+
* @return the result of visiting the is not null expression
103+
*/
104+
T visitIsNotNull(IsNotNull isNotNull);
105+
98106
/**
99107
* For expressions that do not have a specific visitor method.
100108
*/
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// SPDX-FileCopyrightText: Copyright the Vortex contributors
3+
4+
package dev.vortex.api.expressions;
5+
6+
import dev.vortex.api.Expression;
7+
import java.util.List;
8+
import java.util.Objects;
9+
import java.util.Optional;
10+
11+
/**
12+
* Represents an IS NOT NULL expression that checks whether values are non-null.
13+
* This expression returns true for non-null values and false for null values.
14+
*/
15+
public final class IsNotNull implements Expression {
16+
private final Expression child;
17+
18+
private IsNotNull(Expression child) {
19+
this.child = child;
20+
}
21+
22+
/**
23+
* Parses an IsNotNull expression from serialized metadata and child expressions.
24+
* This method is used during deserialization of Vortex expressions.
25+
*
26+
* @param metadata the serialized metadata, must be empty for IsNotNull expressions
27+
* @param children the child expressions, must contain exactly one element
28+
* @return a new IsNotNull expression parsed from the provided data
29+
* @throws IllegalArgumentException if the number of children is not exactly one,
30+
* or if metadata is not empty
31+
*/
32+
public static IsNotNull parse(byte[] metadata, List<Expression> children) {
33+
if (children.size() != 1) {
34+
throw new IllegalArgumentException(
35+
"IsNotNull expression must have exactly one child, found: " + children.size());
36+
}
37+
if (metadata.length > 0) {
38+
throw new IllegalArgumentException(
39+
"IsNotNull expression must not have metadata, found: " + metadata.length);
40+
}
41+
return new IsNotNull(children.get(0));
42+
}
43+
44+
/**
45+
* Creates a new IsNotNull expression that checks non-nullity of the given child expression.
46+
*
47+
* @param child the expression to check for non-null values
48+
* @return a new IsNotNull expression
49+
*/
50+
public static IsNotNull of(Expression child) {
51+
return new IsNotNull(child);
52+
}
53+
54+
@Override
55+
public boolean equals(Object o) {
56+
if (o == null || getClass() != o.getClass()) return false;
57+
IsNotNull other = (IsNotNull) o;
58+
return Objects.equals(child, other.child);
59+
}
60+
61+
@Override
62+
public int hashCode() {
63+
return Objects.hash(child);
64+
}
65+
66+
@Override
67+
public String id() {
68+
return "vortex.is_not_null";
69+
}
70+
71+
@Override
72+
public List<Expression> children() {
73+
return List.of(child);
74+
}
75+
76+
@Override
77+
public Optional<byte[]> metadata() {
78+
return Optional.of(new byte[] {});
79+
}
80+
81+
@Override
82+
public String toString() {
83+
return "vortex.is_not_null(" + child + ")";
84+
}
85+
86+
/**
87+
* Returns the child expression that will be checked for non-null values.
88+
*
89+
* @return the child expression
90+
*/
91+
public Expression getChild() {
92+
return child;
93+
}
94+
95+
@Override
96+
public <T> T accept(Visitor<T> visitor) {
97+
return visitor.visitIsNotNull(this);
98+
}
99+
}

java/vortex-jni/src/main/java/dev/vortex/api/proto/Expressions.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public static ExprProtos.Expr serialize(Expression expression) {
3434
/**
3535
* Deserialize a protocol buffer representation back into an {@link Expression} object.
3636
* The method examines the expression ID and creates the appropriate concrete expression type
37-
* based on the registered expression types (binary, get_item, root, literal, not).
37+
* based on the registered expression types (binary, get_item, root, literal, not, is null,
38+
* is not null).
3839
* If the expression ID is not recognized, an {@link Unknown} expression is created.
3940
*
4041
* @param expr the protocol buffer expression to deserialize
@@ -58,6 +59,8 @@ public static Expression deserialize(ExprProtos.Expr expr) {
5859
return Not.parse(metadata, children);
5960
case "vortex.is_null":
6061
return IsNull.parse(metadata, children);
62+
case "vortex.is_not_null":
63+
return IsNotNull.parse(metadata, children);
6164
default:
6265
return new Unknown(expr.getId(), children, expr.getMetadata().toByteArray());
6366
}

java/vortex-jni/src/test/java/dev/vortex/api/expressions/proto/TestExpressionProtos.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ public void testIsNullRoundTrip() {
3030
Expression deserialized = Expressions.deserialize(proto);
3131
assertEquals(expression, deserialized);
3232
}
33+
34+
@Test
35+
public void testIsNotNullRoundTrip() {
36+
Expression expression = IsNotNull.of(GetItem.of(Root.INSTANCE, "a.b.c"));
37+
ExprProtos.Expr proto = Expressions.serialize(expression);
38+
Expression deserialized = Expressions.deserialize(proto);
39+
assertEquals(expression, deserialized);
40+
}
3341
}

vortex-array/public-api.lock

Lines changed: 99 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8668,6 +8668,8 @@ pub fn vortex_array::builtins::ArrayBuiltins::fill_null(&self, fill_value: impl
86688668

86698669
pub fn vortex_array::builtins::ArrayBuiltins::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::ArrayRef>
86708670

8671+
pub fn vortex_array::builtins::ArrayBuiltins::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
8672+
86718673
pub fn vortex_array::builtins::ArrayBuiltins::is_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
86728674

86738675
pub fn vortex_array::builtins::ArrayBuiltins::list_contains(&self, value: vortex_array::ArrayRef) -> vortex_error::VortexResult<vortex_array::ArrayRef>
@@ -8690,6 +8692,8 @@ pub fn vortex_array::ArrayRef::fill_null(&self, fill_value: impl core::convert::
86908692

86918693
pub fn vortex_array::ArrayRef::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::ArrayRef>
86928694

8695+
pub fn vortex_array::ArrayRef::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
8696+
86938697
pub fn vortex_array::ArrayRef::is_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
86948698

86958699
pub fn vortex_array::ArrayRef::list_contains(&self, value: vortex_array::ArrayRef) -> vortex_error::VortexResult<vortex_array::ArrayRef>
@@ -8710,6 +8714,8 @@ pub fn vortex_array::builtins::ExprBuiltins::fill_null(&self, fill_value: vortex
87108714

87118715
pub fn vortex_array::builtins::ExprBuiltins::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::expr::Expression>
87128716

8717+
pub fn vortex_array::builtins::ExprBuiltins::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
8718+
87138719
pub fn vortex_array::builtins::ExprBuiltins::is_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
87148720

87158721
pub fn vortex_array::builtins::ExprBuiltins::list_contains(&self, value: vortex_array::expr::Expression) -> vortex_error::VortexResult<vortex_array::expr::Expression>
@@ -8730,6 +8736,8 @@ pub fn vortex_array::expr::Expression::fill_null(&self, fill_value: vortex_array
87308736

87318737
pub fn vortex_array::expr::Expression::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::expr::Expression>
87328738

8739+
pub fn vortex_array::expr::Expression::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
8740+
87338741
pub fn vortex_array::expr::Expression::is_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
87348742

87358743
pub fn vortex_array::expr::Expression::list_contains(&self, value: vortex_array::expr::Expression) -> vortex_error::VortexResult<vortex_array::expr::Expression>
@@ -9394,7 +9402,7 @@ impl core::cmp::Eq for vortex_array::dtype::DType
93949402

93959403
impl core::cmp::PartialEq for vortex_array::dtype::DType
93969404

9397-
pub fn vortex_array::dtype::DType::eq(&self, other: &vortex_array::dtype::DType) -> bool
9405+
pub fn vortex_array::dtype::DType::eq(&self, other: &Self) -> bool
93989406

93999407
impl core::convert::From<vortex_array::dtype::DType> for vortex_array::dtype::FieldDType
94009408

@@ -9444,8 +9452,6 @@ impl core::hash::Hash for vortex_array::dtype::DType
94449452

94459453
pub fn vortex_array::dtype::DType::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
94469454

9447-
impl core::marker::StructuralPartialEq for vortex_array::dtype::DType
9448-
94499455
impl vortex_array::dtype::arrow::FromArrowType<&arrow_schema::field::Field> for vortex_array::dtype::DType
94509456

94519457
pub fn vortex_array::dtype::DType::from_arrow(field: &arrow_schema::field::Field) -> Self
@@ -12656,6 +12662,8 @@ pub fn vortex_array::expr::Expression::fill_null(&self, fill_value: vortex_array
1265612662

1265712663
pub fn vortex_array::expr::Expression::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::expr::Expression>
1265812664

12665+
pub fn vortex_array::expr::Expression::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
12666+
1265912667
pub fn vortex_array::expr::Expression::is_null(&self) -> vortex_error::VortexResult<vortex_array::expr::Expression>
1266012668

1266112669
pub fn vortex_array::expr::Expression::list_contains(&self, value: vortex_array::expr::Expression) -> vortex_error::VortexResult<vortex_array::expr::Expression>
@@ -12750,6 +12758,8 @@ pub fn vortex_array::expr::immediate_scope_access<'a>(expr: &'a vortex_array::ex
1275012758

1275112759
pub fn vortex_array::expr::immediate_scope_accesses<'a>(expr: &'a vortex_array::expr::Expression, scope: &'a vortex_array::dtype::StructFields) -> vortex_array::expr::FieldAccesses<'a>
1275212760

12761+
pub fn vortex_array::expr::is_not_null(child: vortex_array::expr::Expression) -> vortex_array::expr::Expression
12762+
1275312763
pub fn vortex_array::expr::is_null(child: vortex_array::expr::Expression) -> vortex_array::expr::Expression
1275412764

1275512765
pub fn vortex_array::expr::is_root(expr: &vortex_array::expr::Expression) -> bool
@@ -16532,6 +16542,52 @@ pub fn vortex_array::scalar_fn::fns::get_item::GetItem::stat_falsification(&self
1653216542

1653316543
pub fn vortex_array::scalar_fn::fns::get_item::GetItem::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
1653416544

16545+
pub mod vortex_array::scalar_fn::fns::is_not_null
16546+
16547+
pub struct vortex_array::scalar_fn::fns::is_not_null::IsNotNull
16548+
16549+
impl core::clone::Clone for vortex_array::scalar_fn::fns::is_not_null::IsNotNull
16550+
16551+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::clone(&self) -> vortex_array::scalar_fn::fns::is_not_null::IsNotNull
16552+
16553+
impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::is_not_null::IsNotNull
16554+
16555+
pub type vortex_array::scalar_fn::fns::is_not_null::IsNotNull::Options = vortex_array::scalar_fn::EmptyOptions
16556+
16557+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::arity(&self, _options: &Self::Options) -> vortex_array::scalar_fn::Arity
16558+
16559+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::child_name(&self, _instance: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName
16560+
16561+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<alloc::vec::Vec<vortex_array::dtype::DType>>
16562+
16563+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::deserialize(&self, _metadata: &[u8], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Options>
16564+
16565+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::execute(&self, _data: &Self::Options, args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::ArrayRef>
16566+
16567+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::fmt_sql(&self, _options: &Self::Options, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
16568+
16569+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::id(&self) -> vortex_array::scalar_fn::ScalarFnId
16570+
16571+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::is_fallible(&self, _instance: &Self::Options) -> bool
16572+
16573+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::is_null_sensitive(&self, _instance: &Self::Options) -> bool
16574+
16575+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::scalar_fn::ReduceNodeRef>>
16576+
16577+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::return_dtype(&self, _options: &Self::Options, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<vortex_array::dtype::DType>
16578+
16579+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::serialize(&self, _instance: &Self::Options) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
16580+
16581+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
16582+
16583+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
16584+
16585+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option<vortex_array::expr::Expression>
16586+
16587+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::stat_falsification(&self, _options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option<vortex_array::expr::Expression>
16588+
16589+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
16590+
1653516591
pub mod vortex_array::scalar_fn::fns::is_null
1653616592

1653716593
pub struct vortex_array::scalar_fn::fns::is_null::IsNull
@@ -18314,6 +18370,44 @@ pub fn vortex_array::scalar_fn::fns::get_item::GetItem::stat_falsification(&self
1831418370

1831518371
pub fn vortex_array::scalar_fn::fns::get_item::GetItem::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
1831618372

18373+
impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::is_not_null::IsNotNull
18374+
18375+
pub type vortex_array::scalar_fn::fns::is_not_null::IsNotNull::Options = vortex_array::scalar_fn::EmptyOptions
18376+
18377+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::arity(&self, _options: &Self::Options) -> vortex_array::scalar_fn::Arity
18378+
18379+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::child_name(&self, _instance: &Self::Options, child_idx: usize) -> vortex_array::scalar_fn::ChildName
18380+
18381+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::coerce_args(&self, options: &Self::Options, args: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<alloc::vec::Vec<vortex_array::dtype::DType>>
18382+
18383+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::deserialize(&self, _metadata: &[u8], _session: &vortex_session::VortexSession) -> vortex_error::VortexResult<Self::Options>
18384+
18385+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::execute(&self, _data: &Self::Options, args: &dyn vortex_array::scalar_fn::ExecutionArgs, _ctx: &mut vortex_array::ExecutionCtx) -> vortex_error::VortexResult<vortex_array::ArrayRef>
18386+
18387+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::fmt_sql(&self, _options: &Self::Options, expr: &vortex_array::expr::Expression, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
18388+
18389+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::id(&self) -> vortex_array::scalar_fn::ScalarFnId
18390+
18391+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::is_fallible(&self, _instance: &Self::Options) -> bool
18392+
18393+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::is_null_sensitive(&self, _instance: &Self::Options) -> bool
18394+
18395+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::reduce(&self, options: &Self::Options, node: &dyn vortex_array::scalar_fn::ReduceNode, ctx: &dyn vortex_array::scalar_fn::ReduceCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::scalar_fn::ReduceNodeRef>>
18396+
18397+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::return_dtype(&self, _options: &Self::Options, _arg_dtypes: &[vortex_array::dtype::DType]) -> vortex_error::VortexResult<vortex_array::dtype::DType>
18398+
18399+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::serialize(&self, _instance: &Self::Options) -> vortex_error::VortexResult<core::option::Option<alloc::vec::Vec<u8>>>
18400+
18401+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::simplify(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, ctx: &dyn vortex_array::scalar_fn::SimplifyCtx) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
18402+
18403+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::simplify_untyped(&self, options: &Self::Options, expr: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
18404+
18405+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::stat_expression(&self, options: &Self::Options, expr: &vortex_array::expr::Expression, stat: vortex_array::expr::stats::Stat, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option<vortex_array::expr::Expression>
18406+
18407+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::stat_falsification(&self, _options: &Self::Options, expr: &vortex_array::expr::Expression, catalog: &dyn vortex_array::expr::pruning::StatsCatalog) -> core::option::Option<vortex_array::expr::Expression>
18408+
18409+
pub fn vortex_array::scalar_fn::fns::is_not_null::IsNotNull::validity(&self, options: &Self::Options, expression: &vortex_array::expr::Expression) -> vortex_error::VortexResult<core::option::Option<vortex_array::expr::Expression>>
18410+
1831718411
impl vortex_array::scalar_fn::ScalarFnVTable for vortex_array::scalar_fn::fns::is_null::IsNull
1831818412

1831918413
pub type vortex_array::scalar_fn::fns::is_null::IsNull::Options = vortex_array::scalar_fn::EmptyOptions
@@ -22820,6 +22914,8 @@ pub fn vortex_array::ArrayRef::fill_null(&self, fill_value: impl core::convert::
2282022914

2282122915
pub fn vortex_array::ArrayRef::get_item(&self, field_name: impl core::convert::Into<vortex_array::dtype::FieldName>) -> vortex_error::VortexResult<vortex_array::ArrayRef>
2282222916

22917+
pub fn vortex_array::ArrayRef::is_not_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
22918+
2282322919
pub fn vortex_array::ArrayRef::is_null(&self) -> vortex_error::VortexResult<vortex_array::ArrayRef>
2282422920

2282522921
pub fn vortex_array::ArrayRef::list_contains(&self, value: vortex_array::ArrayRef) -> vortex_error::VortexResult<vortex_array::ArrayRef>

0 commit comments

Comments
 (0)