marvinlanhenke commented on code in PR #320:
URL: https://github.com/apache/iceberg-rust/pull/320#discussion_r1553297280


##########
crates/iceberg/src/expr/visitors/bound_predicate_visitor.rs:
##########
@@ -0,0 +1,366 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use crate::expr::{BoundPredicate, BoundReference, PredicateOperator};
+use crate::spec::Datum;
+use crate::Result;
+use fnv::FnvHashSet;
+
+pub trait BoundPredicateVisitor {
+    type T;
+
+    fn always_true(&mut self) -> Result<Self::T>;
+    fn always_false(&mut self) -> Result<Self::T>;
+
+    fn and(&mut self, lhs: Self::T, rhs: Self::T) -> Result<Self::T>;
+    fn or(&mut self, lhs: Self::T, rhs: Self::T) -> Result<Self::T>;
+    fn not(&mut self, inner: Self::T) -> Result<Self::T>;
+
+    fn is_null(&mut self, reference: &BoundReference) -> Result<Self::T>;

Review Comment:
   > Another option is to use following method:
   > 
   > ```rust
   > trait BoundPredicateVisitor {
   >   fn visitor_op(&mut self, op: &PredicateOperator, reference: 
&BoundReference, results: Vec<Self::T>) -> Result<Self::T> {}
   > }
   > ```
   
   I think I'm in favor of keeping the trait as generic as possible - so we 
don't have to modify it, if we have to support a new operator. 
   
   When implementing this trait (no matter which variant) I'd most likely have 
to overwrite the default behaviour anyway? So I wouldn't bother providing any 
in the first place and keep the trait as generic and future proof as possible? 
If that makes any sense to you?
   
   >This way we can force user to think about added new operator, otherwise it 
will throw compiler error, but this may break things when we add new operator.
   
   ...wouldn't I have match `op` anyway, so having a default match arm in the 
implementation would solve the issue for the downstream user?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to