findepi commented on code in PR #17067: URL: https://github.com/apache/datafusion/pull/17067#discussion_r2261999283
########## datafusion/expr/src/udf_eq.rs: ########## @@ -0,0 +1,181 @@ +// 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::{AggregateUDFImpl, ScalarUDFImpl, WindowUDFImpl}; +use std::fmt::Debug; +use std::hash::{Hash, Hasher}; +use std::ops::Deref; +use std::sync::Arc; + +/// A wrapper around a pointer to UDF that implements `Eq` and `Hash` delegating to +/// corresponding methods on the UDF trait. +#[derive(Clone)] +#[allow(private_bounds)] // This is so that UdfEq can only be used with allowed pointer types (e.g. Arc), without allowing misuse. +pub struct UdfEq<Ptr: UdfPointer>(Ptr); Review Comment: BTW In theory we shouldn't need this type. Should be enough to implement `PartialEq for dyn WindowUDFImpl + '_` and let the rest be derived. However, the compiler errs out likes this: ``` error[E0507]: cannot move out of a shared reference --> datafusion/expr/src/udwf.rs:479:5 | 477 | #[derive(Debug, PartialEq, Hash)] | --------- in this derive macro expansion 478 | struct AliasedWindowUDFImpl { 479 | inner: Arc<dyn WindowUDFImpl>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `std::sync::Arc<dyn udwf::WindowUDFImpl>`, which does not implement the `Copy` trait | help: clone the value to increment its reference count | 479 | inner: Arc<dyn WindowUDFImpl>.clone(), ``` The suggestion fix is particularily funny, but the problem is real. It seems to be tracked by https://github.com/rust-lang/rust/issues/31740 and the solution people seem be using is to have a newtype around the pointer... Exactly what we have. -- 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: github-unsubscr...@datafusion.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org