LuciferYang commented on code in PR #37843:
URL: https://github.com/apache/spark/pull/37843#discussion_r972590525


##########
sql/catalyst/src/main/java/org/apache/spark/sql/connector/expressions/Expression.java:
##########
@@ -44,7 +46,12 @@ public interface Expression {
    * List of fields or columns that are referenced by this expression.
    */
   default NamedReference[] references() {
-    return Arrays.stream(children()).map(e -> e.references())
-      .flatMap(Arrays::stream).distinct().toArray(NamedReference[]::new);
+    // SPARK-40398: Replace `Arrays.stream()...distinct()`
+    // to this for perf gain, the result order is not important.
+    Set<NamedReference> set = new HashSet<>();
+    for (Expression e : children()) {
+      Collections.addAll(set, e.references());
+    }
+    return set.toArray(new NamedReference[0]);

Review Comment:
   `nstall dependencies for documentation generation` still failed 
   
   https://github.com/LuciferYang/spark/actions/runs/3064658259/jobs/4947983207
   
   ```
    × Building wheel for pyzmq (pyproject.toml) did not run successfully.
     │ exit code: 1
     ╰─> [186 lines of output]
         
/tmp/pip-build-env-812k46kb/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py:262:
 UserWarning: Unknown distribution option: 'cffi_modules'
           warnings.warn(msg)
         running bdist_wheel
         running build
         running build_py
         copying zmq/error.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/asyncio.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/_future.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/_typing.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/decorators.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/constants.py -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/__init__.py -> build/lib.linux-x86_64-cpython-39/zmq
         creating build/lib.linux-x86_64-cpython-39/zmq/log
         copying zmq/log/__main__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/log
         copying zmq/log/handlers.py -> 
build/lib.linux-x86_64-cpython-39/zmq/log
         copying zmq/log/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/log
         creating build/lib.linux-x86_64-cpython-39/zmq/green
         copying zmq/green/device.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green
         copying zmq/green/poll.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green
         copying zmq/green/core.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green
         copying zmq/green/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green
         creating build/lib.linux-x86_64-cpython-39/zmq/green/eventloop
         copying zmq/green/eventloop/ioloop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green/eventloop
         copying zmq/green/eventloop/zmqstream.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green/eventloop
         copying zmq/green/eventloop/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/green/eventloop
         creating build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_imports.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_future.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_asyncio.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_win32_shim.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_etc.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_draft.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_message.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_monqueue.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_multipart.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_error.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_constants.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_poll.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/conftest.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_monitor.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_security.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_context.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_mypy.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_ssh.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_z85.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_cffi_backend.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_ioloop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_auth.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_pair.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_device.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_includes.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_socket.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_cython.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_log.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_pubsub.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_ext.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_zmqstream.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_reqrep.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_proxy_steerable.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_version.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_retry_eintr.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         copying zmq/tests/test_decorators.py -> 
build/lib.linux-x86_64-cpython-39/zmq/tests
         creating build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/proxydevice.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/monitoredqueuedevice.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/proxysteerabledevice.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/monitoredqueue.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/basedevice.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/devices/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         creating build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/asyncio.py -> 
build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/certs.py -> build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/ioloop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/base.py -> build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/auth
         copying zmq/auth/thread.py -> 
build/lib.linux-x86_64-cpython-39/zmq/auth
         creating build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/interop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/garbage.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/win32.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/jsonapi.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/monitor.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/z85.py -> build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/strtypes.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         creating build/lib.linux-x86_64-cpython-39/zmq/backend
         copying zmq/backend/select.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend
         copying zmq/backend/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend
         creating build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         creating build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/error.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/context.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/message.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/_poll.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/devices.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/socket.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/utils.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/backend/cffi/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         creating build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/version.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/tracker.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/context.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/attrsettr.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/poll.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/frame.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/stopwatch.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/socket.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         copying zmq/sugar/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         creating build/lib.linux-x86_64-cpython-39/zmq/ssh
         copying zmq/ssh/tunnel.py -> build/lib.linux-x86_64-cpython-39/zmq/ssh
         copying zmq/ssh/forward.py -> build/lib.linux-x86_64-cpython-39/zmq/ssh
         copying zmq/ssh/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/ssh
         creating build/lib.linux-x86_64-cpython-39/zmq/eventloop
         copying zmq/eventloop/ioloop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop
         copying zmq/eventloop/zmqstream.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop
         copying zmq/eventloop/future.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop
         copying zmq/eventloop/_deprecated.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop
         copying zmq/eventloop/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop
         creating build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/log.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/stack_context.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/concurrent.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/ioloop.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/util.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         copying zmq/eventloop/minitornado/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado
         creating 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/interface.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/auto.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/common.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/windows.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/posix.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/eventloop/minitornado/platform/__init__.py -> 
build/lib.linux-x86_64-cpython-39/zmq/eventloop/minitornado/platform
         copying zmq/__init__.pxd -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/__init__.pyi -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/py.typed -> build/lib.linux-x86_64-cpython-39/zmq
         copying zmq/devices/monitoredqueue.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/devices
         copying zmq/utils/buffers.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/zmq_compat.h -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/pyversion_compat.h -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/mutex.h -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/ipcmaxlen.h -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/getpid_compat.h -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/compiler.json -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/utils/config.json -> 
build/lib.linux-x86_64-cpython-39/zmq/utils
         copying zmq/backend/__init__.pyi -> 
build/lib.linux-x86_64-cpython-39/zmq/backend
         copying zmq/backend/cython/context.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/socket.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/__init__.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/message.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/checkrc.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/libzmq.pxd -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cython/constant_enums.pxi -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cython
         copying zmq/backend/cffi/_cdefs.h -> 
build/lib.linux-x86_64-cpython-39/zmq/backend/cffi
         copying zmq/sugar/__init__.pyi -> 
build/lib.linux-x86_64-cpython-39/zmq/sugar
         running build_ext
         running configure
         Using bundled libzmq
         already have bundled/zeromq
         already have platform.hpp
         checking for timer_create
         ************************************************
         ************************************************
         x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare 
-DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat 
-Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/include/python3.9 -c 
/tmp/timer_createwdqm_dcl.c -o tmp/timer_createwdqm_dcl.o
         /tmp/timer_createwdqm_dcl.c: In function ‘main’:
         /tmp/timer_createwdqm_dcl.c:2:5: warning: implicit declaration of 
function ‘timer_create’ [-Wimplicit-function-declaration]
             2 |     timer_create();
               |     ^~~~~~~~~~~~
         x86_64-linux-gnu-gcc -pthread tmp/timer_createwdqm_dcl.o 
-L/usr/lib/x86_64-linux-gnu -o a.out
         /usr/bin/ld: tmp/timer_createwdqm_dcl.o: in function `main':
         /tmp/timer_createwdqm_dcl.c:2: undefined reference to `timer_create'
         collect2: error: ld returned 1 exit status
         no timer_create, linking librt
         ************************************************
         building 'zmq.libzmq' extension
         creating build/temp.linux-x86_64-cpython-39/buildutils
         creating build/temp.linux-x86_64-cpython-39/bundled
         creating build/temp.linux-x86_64-cpython-39/bundled/zeromq
         creating build/temp.linux-x86_64-cpython-39/bundled/zeromq/src
         x86_64-linux-gnu-g++ -pthread -std=c++11 -pthread -Wno-unused-result 
-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong 
-Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -DZMQ_HAVE_CURVE=1 
-DZMQ_USE_TWEETNACL=1 -DZMQ_USE_EPOLL=1 -DZMQ_IOTHREADS_USE_EPOLL=1 
-DZMQ_POLL_BASED_ON_POLL=1 -Ibundled/zeromq/include -Ibundled 
-I/usr/include/python3.9 -c buildutils/initlibzmq.cpp -o 
build/temp.linux-x86_64-cpython-39/buildutils/initlibzmq.o
         buildutils/initlibzmq.cpp:10:10: fatal error: Python.h: No such file 
or directory
            10 | #include "Python.h"
               |          ^~~~~~~~~~
         compilation terminated.
         error: command '/usr/bin/x86_64-linux-gnu-g++' failed with exit code 1
         [end of output]
     
     note: This error originates from a subprocess, and is likely not a problem 
with pip.
     ERROR: Failed building wheel for pyzmq
   ERROR: Could not build wheels for pyzmq, which is required to install 
pyproject.toml-based projects
   Failed to build pyzmq
   Error: Process completed with exit code 1.
   ```
   
   friendly ping @HyukjinKwon @Yikun to help to check this



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to