Skip to content

Commit 201f7c8

Browse files
horakivosteve-s
authored andcommitted
[GR-48910] Introduce enable_java_integration method.
PullRequest: graalpython/3656
2 parents 69e88ef + 7205e0a commit 201f7c8

File tree

1 file changed

+84
-62
lines changed

1 file changed

+84
-62
lines changed
Lines changed: 84 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -43,102 +43,124 @@
4343
try:
4444
java.type("org.apache.arrow.vector.BaseFixedWidthVector")
4545
except KeyError:
46-
raise ImportError("It is not possible to import Apache Arrow Vector classes because arrow-vector package is not on the class path. Please add this library to your project.")
46+
raise ImportError(
47+
"It is not possible to import Apache Arrow Vector classes because arrow-vector package is not on the class path. Please add this library to your project.")
4748

4849
if not __graalpython__.host_import_enabled:
4950
raise NotImplementedError("Host lookup is not allowed. You can allow it while building python context.")
50-
else:
51-
class TinyIntVector:
5251

53-
def __len__(self):
54-
return self.getValueCount()
5552

56-
def __arrow_c_array__(self, requested_schema=None):
57-
return __graalpython__.export_arrow_vector(self)
53+
class TinyIntVector:
5854

55+
def __len__(self):
56+
return self.getValueCount()
5957

60-
class SmallIntVector:
58+
def __arrow_c_array__(self, requested_schema=None):
59+
return __graalpython__.export_arrow_vector(self)
6160

62-
def __len__(self):
63-
return self.getValueCount()
6461

65-
def __arrow_c_array__(self, requested_schema=None):
66-
return __graalpython__.export_arrow_vector(self)
62+
class SmallIntVector:
6763

64+
def __len__(self):
65+
return self.getValueCount()
6866

69-
class IntVector:
67+
def __arrow_c_array__(self, requested_schema=None):
68+
return __graalpython__.export_arrow_vector(self)
7069

71-
def __len__(self):
72-
return self.getValueCount()
7370

74-
def __arrow_c_array__(self, requested_schema=None):
75-
return __graalpython__.export_arrow_vector(self)
71+
class IntVector:
7672

73+
def __len__(self):
74+
return self.getValueCount()
7775

78-
class BigIntVector:
76+
def __arrow_c_array__(self, requested_schema=None):
77+
return __graalpython__.export_arrow_vector(self)
7978

80-
def __len__(self):
81-
return self.getValueCount()
8279

83-
def __arrow_c_array__(self, requested_schema=None):
84-
return __graalpython__.export_arrow_vector(self)
80+
class BigIntVector:
8581

82+
def __len__(self):
83+
return self.getValueCount()
8684

87-
class BitVector:
85+
def __arrow_c_array__(self, requested_schema=None):
86+
return __graalpython__.export_arrow_vector(self)
8887

89-
def __len__(self):
90-
return self.getValueCount()
9188

92-
def __arrow_c_array__(self, requested_schema=None):
93-
return __graalpython__.export_arrow_vector(self)
89+
class BitVector:
9490

91+
def __len__(self):
92+
return self.getValueCount()
9593

96-
class Float2Vector:
94+
def __arrow_c_array__(self, requested_schema=None):
95+
return __graalpython__.export_arrow_vector(self)
9796

98-
def __len__(self):
99-
return self.getValueCount()
10097

101-
def __arrow_c_array__(self, requested_schema=None):
102-
return __graalpython__.export_arrow_vector(self)
98+
class Float2Vector:
10399

100+
def __len__(self):
101+
return self.getValueCount()
104102

105-
class Float4Vector:
103+
def __arrow_c_array__(self, requested_schema=None):
104+
return __graalpython__.export_arrow_vector(self)
106105

107-
def __len__(self):
108-
return self.getValueCount()
109106

110-
def __arrow_c_array__(self, requested_schema=None):
111-
return __graalpython__.export_arrow_vector(self)
107+
class Float4Vector:
112108

109+
def __len__(self):
110+
return self.getValueCount()
113111

114-
class Float8Vector:
112+
def __arrow_c_array__(self, requested_schema=None):
113+
return __graalpython__.export_arrow_vector(self)
115114

116-
def __len__(self):
117-
return self.getValueCount()
118115

119-
def __arrow_c_array__(self, requested_schema=None):
120-
return __graalpython__.export_arrow_vector(self)
116+
class Float8Vector:
121117

118+
def __len__(self):
119+
return self.getValueCount()
122120

123-
# Ints
124-
int8_vector_class_path = java.type("org.apache.arrow.vector.TinyIntVector")
125-
int16_vector_class_path = java.type("org.apache.arrow.vector.SmallIntVector")
126-
int32_vector_class_path = java.type("org.apache.arrow.vector.IntVector")
127-
int64_vector_class_path = java.type("org.apache.arrow.vector.BigIntVector")
128-
# Boolean
129-
boolean_vector_class_path = java.type("org.apache.arrow.vector.BitVector")
130-
# Floats
131-
float2_vector_class_path = java.type("org.apache.arrow.vector.Float2Vector")
132-
float4_vector_class_path = java.type("org.apache.arrow.vector.Float4Vector")
133-
float8_vector_class_path = java.type("org.apache.arrow.vector.Float8Vector")
121+
def __arrow_c_array__(self, requested_schema=None):
122+
return __graalpython__.export_arrow_vector(self)
134123

135-
polyglot.register_interop_type(int8_vector_class_path, TinyIntVector)
136-
polyglot.register_interop_type(int16_vector_class_path, SmallIntVector)
137-
polyglot.register_interop_type(int32_vector_class_path, IntVector)
138-
polyglot.register_interop_type(int64_vector_class_path, BigIntVector)
139124

140-
polyglot.register_interop_type(boolean_vector_class_path, BitVector)
125+
__enabled_java_integration = False
141126

142-
polyglot.register_interop_type(float2_vector_class_path, Float2Vector)
143-
polyglot.register_interop_type(float4_vector_class_path, Float4Vector)
144-
polyglot.register_interop_type(float8_vector_class_path, Float8Vector)
127+
128+
def enable_java_integration(allow_method_overwrites: bool = False):
129+
"""
130+
This method enables passing Java Apache Arrow vector classes directly to Python code without copying any memory.
131+
It basically calls `polyglot.register_interop_type` on every vector class defined in the library.
132+
Calling the method more than once has no effect.
133+
134+
If allow_method_overwrites=True, defining the same method is explicitly allowed.
135+
"""
136+
global __enabled_java_integration
137+
if not __enabled_java_integration:
138+
__enabled_java_integration = True
139+
# Ints
140+
int8_vector_class_path = java.type("org.apache.arrow.vector.TinyIntVector")
141+
int16_vector_class_path = java.type("org.apache.arrow.vector.SmallIntVector")
142+
int32_vector_class_path = java.type("org.apache.arrow.vector.IntVector")
143+
int64_vector_class_path = java.type("org.apache.arrow.vector.BigIntVector")
144+
# Boolean
145+
boolean_vector_class_path = java.type("org.apache.arrow.vector.BitVector")
146+
# Floats
147+
float2_vector_class_path = java.type("org.apache.arrow.vector.Float2Vector")
148+
float4_vector_class_path = java.type("org.apache.arrow.vector.Float4Vector")
149+
float8_vector_class_path = java.type("org.apache.arrow.vector.Float8Vector")
150+
151+
polyglot.register_interop_type(int8_vector_class_path, TinyIntVector,
152+
allow_method_overwrites=allow_method_overwrites)
153+
polyglot.register_interop_type(int16_vector_class_path, SmallIntVector,
154+
allow_method_overwrites=allow_method_overwrites)
155+
polyglot.register_interop_type(int32_vector_class_path, IntVector,
156+
allow_method_overwrites=allow_method_overwrites)
157+
polyglot.register_interop_type(int64_vector_class_path, BigIntVector,
158+
allow_method_overwrites=allow_method_overwrites)
159+
polyglot.register_interop_type(boolean_vector_class_path, BitVector,
160+
allow_method_overwrites=allow_method_overwrites)
161+
polyglot.register_interop_type(float2_vector_class_path, Float2Vector,
162+
allow_method_overwrites=allow_method_overwrites)
163+
polyglot.register_interop_type(float4_vector_class_path, Float4Vector,
164+
allow_method_overwrites=allow_method_overwrites)
165+
polyglot.register_interop_type(float8_vector_class_path, Float8Vector,
166+
allow_method_overwrites=allow_method_overwrites)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy