@@ -59,9 +59,8 @@ public class Query implements AutoCloseable {
59
59
60
60
private NativeArray subarray ;
61
61
62
- private Map <String , NativeArray > buffers_ ;
63
62
private Map <String , Pair <ByteBuffer , ByteBuffer >> byteBuffers_ ;
64
- private Map <String , Pair <NativeArray , NativeArray >> var_buffers_ ;
63
+ private Map <String , Pair <NativeArray , NativeArray >> buffers_ ;
65
64
private Map <String , Pair <uint64_tArray , uint64_tArray >> buffer_sizes_ ;
66
65
67
66
public Query (Array array , QueryType type ) throws TileDBError {
@@ -82,7 +81,6 @@ public Query(Array array, QueryType type) throws TileDBError {
82
81
this .queryp = tiledb .tiledb_query_tpp_value (_querypp );
83
82
this .buffers_ = Collections .synchronizedMap (new HashMap <>());
84
83
this .byteBuffers_ = Collections .synchronizedMap (new HashMap <>());
85
- this .var_buffers_ = Collections .synchronizedMap (new HashMap <>());
86
84
this .buffer_sizes_ = Collections .synchronizedMap (new HashMap <>());
87
85
}
88
86
@@ -130,9 +128,11 @@ public QueryStatus submit() throws TileDBError {
130
128
for (String attribute : byteBuffers_ .keySet ()) {
131
129
boolean isVar ;
132
130
133
- if (array .getSchema ().hasAttribute (attribute ))
134
- isVar = array .getSchema ().getAttribute (attribute ).isVar ();
135
- else isVar = array .getSchema ().getDomain ().getDimension (attribute ).isVar ();
131
+ try (ArraySchema arraySchema = array .getSchema ()) {
132
+ if (arraySchema .hasAttribute (attribute ))
133
+ isVar = arraySchema .getAttribute (attribute ).isVar ();
134
+ else isVar = arraySchema .getDomain ().getDimension (attribute ).isVar ();
135
+ }
136
136
137
137
if (isVar ) {
138
138
int offset_nbytes = this .buffer_sizes_ .get (attribute ).getFirst ().getitem (0 ).intValue ();
@@ -414,10 +414,10 @@ public synchronized Query setBuffer(String attr, NativeArray buffer) throws Tile
414
414
415
415
// Close previous buffers if they exist for this attribute
416
416
if (buffers_ .containsKey (attr )) {
417
- buffers_ .get (attr ).close ();
417
+ buffers_ .get (attr ).getSecond (). close ();
418
418
}
419
419
420
- buffers_ .put (attr , buffer );
420
+ buffers_ .put (attr , new Pair ( null , buffer ) );
421
421
buffer_sizes_ .put (attr , buffer_sizes );
422
422
423
423
// Set the actual TileDB buffer
@@ -475,10 +475,10 @@ public synchronized Query setBuffer(String attr, NativeArray buffer, long buffer
475
475
476
476
// Close previous buffers if they exist for this attribute
477
477
if (buffers_ .containsKey (attr )) {
478
- buffers_ .get (attr ).close ();
478
+ buffers_ .get (attr ).getSecond (). close ();
479
479
}
480
480
481
- buffers_ .put (attr , buffer );
481
+ buffers_ .put (attr , new Pair ( null , buffer ) );
482
482
buffer_sizes_ .put (attr , buffer_sizes );
483
483
484
484
// Set the actual TileDB buffer
@@ -619,13 +619,13 @@ public synchronized Query setBuffer(String attr, NativeArray offsets, NativeArra
619
619
new Pair <>(offsets_array_size , values_array_size );
620
620
621
621
// Close previous buffers if they exist for this attribute
622
- if (var_buffers_ .containsKey (attr )) {
623
- Pair <NativeArray , NativeArray > prev_buffers = var_buffers_ .get (attr );
622
+ if (buffers_ .containsKey (attr )) {
623
+ Pair <NativeArray , NativeArray > prev_buffers = buffers_ .get (attr );
624
624
prev_buffers .getFirst ().close ();
625
625
prev_buffers .getSecond ().close ();
626
626
}
627
627
628
- var_buffers_ .put (attr , new Pair <>(offsets , buffer ));
628
+ buffers_ .put (attr , new Pair <>(offsets , buffer ));
629
629
buffer_sizes_ .put (attr , buffer_sizes );
630
630
631
631
ctx .handleError (
@@ -679,8 +679,8 @@ public synchronized Query setBuffer(String attr, ByteBuffer offsets, ByteBuffer
679
679
new Pair <>(offsets_array_size , values_array_size );
680
680
681
681
// Close previous buffers if they exist for this attribute
682
- if (var_buffers_ .containsKey (attr )) {
683
- Pair <NativeArray , NativeArray > prev_buffers = var_buffers_ .get (attr );
682
+ if (buffers_ .containsKey (attr )) {
683
+ Pair <NativeArray , NativeArray > prev_buffers = buffers_ .get (attr );
684
684
prev_buffers .getFirst ().close ();
685
685
prev_buffers .getSecond ().close ();
686
686
}
@@ -765,13 +765,13 @@ public synchronized Query setBuffer(
765
765
new Pair <>(offsets_array_size , values_array_size );
766
766
767
767
// Close previous buffers if they exist for this attribute
768
- if (var_buffers_ .containsKey (attr )) {
769
- Pair <NativeArray , NativeArray > prev_buffers = var_buffers_ .get (attr );
768
+ if (buffers_ .containsKey (attr )) {
769
+ Pair <NativeArray , NativeArray > prev_buffers = buffers_ .get (attr );
770
770
prev_buffers .getFirst ().close ();
771
771
prev_buffers .getSecond ().close ();
772
772
}
773
773
774
- var_buffers_ .put (attr , new Pair <>(offsets , buffer ));
774
+ buffers_ .put (attr , new Pair <>(offsets , buffer ));
775
775
buffer_sizes_ .put (attr , buffer_sizes );
776
776
777
777
ctx .handleError (
@@ -795,13 +795,13 @@ private Query setBufferSizeUnsafe(String attribute, long offsetSize, long buffer
795
795
796
796
public synchronized Query setBufferByteSize (String attribute , Long offsetSize , Long bufferSize )
797
797
throws TileDBError {
798
- if (!var_buffers_ .containsKey (attribute )) {
798
+ if (!buffers_ .containsKey (attribute )) {
799
799
throw new TileDBError ("Query var attribute buffer does not exist: " + attribute );
800
800
}
801
801
if (offsetSize <= 0 || bufferSize <= 0 ) {
802
802
throw new TileDBError ("Number of buffer bytes must be >= 1" );
803
803
}
804
- Pair <NativeArray , NativeArray > varBuffers = var_buffers_ .get (attribute );
804
+ Pair <NativeArray , NativeArray > varBuffers = buffers_ .get (attribute );
805
805
NativeArray offsetBuffer = varBuffers .getFirst ();
806
806
Long offsetNBytes = offsetBuffer .getNBytes ();
807
807
NativeArray buffer = varBuffers .getSecond ();
@@ -831,7 +831,7 @@ public synchronized Query setBufferByteSize(String attribute, Long bufferSize)
831
831
if (bufferSize <= 0 ) {
832
832
throw new TileDBError ("Number of buffer bytes must be >= 1" );
833
833
}
834
- NativeArray buffer = buffers_ .get (attribute );
834
+ NativeArray buffer = buffers_ .get (attribute ). getSecond () ;
835
835
Long bufferNBytes = buffer .getNBytes ();
836
836
if (bufferSize > bufferNBytes ) {
837
837
throw new TileDBError (
@@ -851,7 +851,7 @@ public synchronized Query setBufferElements(String attribute, Integer bufferElem
851
851
if (bufferElements <= 0 ) {
852
852
throw new TileDBError ("Number of buffer elements must be >= 1" );
853
853
}
854
- NativeArray buffer = buffers_ .get (attribute );
854
+ NativeArray buffer = buffers_ .get (attribute ). getSecond () ;
855
855
Integer bufferSize = buffer .getSize ();
856
856
if (bufferElements > bufferSize ) {
857
857
throw new TileDBError (
@@ -865,13 +865,13 @@ public synchronized Query setBufferElements(String attribute, Integer bufferElem
865
865
866
866
public synchronized Query setBufferElements (
867
867
String attribute , Integer offsetElements , Integer bufferElements ) throws TileDBError {
868
- if (!var_buffers_ .containsKey (attribute )) {
868
+ if (!buffers_ .containsKey (attribute )) {
869
869
throw new TileDBError ("Query var attribute buffer does not exist: " + attribute );
870
870
}
871
871
if (offsetElements <= 0 || bufferElements <= 0 ) {
872
872
throw new TileDBError ("Number of buffer elements must be >= 1" );
873
873
}
874
- Pair <NativeArray , NativeArray > varBuffers = var_buffers_ .get (attribute );
874
+ Pair <NativeArray , NativeArray > varBuffers = buffers_ .get (attribute );
875
875
NativeArray offsetBuffer = varBuffers .getFirst ();
876
876
Integer offsetSize = offsetBuffer .getSize ();
877
877
NativeArray buffer = varBuffers .getSecond ();
@@ -928,28 +928,32 @@ public Object getCoordinates() throws TileDBError {
928
928
*/
929
929
public HashMap <String , Pair <Long , Long >> resultBufferElements () throws TileDBError {
930
930
HashMap <String , Pair <Long , Long >> result = new HashMap <String , Pair <Long , Long >>();
931
- for (Map .Entry <String , NativeArray > entry : buffers_ .entrySet ()) {
932
- String name = entry .getKey ();
933
- NativeArray val_buffer = entry .getValue ();
934
- BigInteger val_nbytes = buffer_sizes_ .get (name ).getSecond ().getitem (0 );
935
- Long nelements =
936
- val_nbytes .divide (BigInteger .valueOf (val_buffer .getNativeTypeSize ())).longValue ();
937
- result .put (name , new Pair <>(0l , nelements ));
938
- }
939
- for (Map .Entry <String , Pair <NativeArray , NativeArray >> entry : var_buffers_ .entrySet ()) {
931
+ for (Map .Entry <String , Pair <NativeArray , NativeArray >> entry : buffers_ .entrySet ()) {
940
932
String name = entry .getKey ();
941
- Pair <uint64_tArray , uint64_tArray > buffer_size = buffer_sizes_ .get (name );
942
-
943
- NativeArray off_buffer = entry .getValue ().getFirst ();
944
- BigInteger off_nbytes = buffer_size .getFirst ().getitem (0 );
945
- Long off_nelements =
946
- off_nbytes .divide (BigInteger .valueOf (off_buffer .getNativeTypeSize ())).longValue ();
947
933
948
- NativeArray val_buffer = entry .getValue ().getSecond ();
949
- BigInteger val_nbytes = buffer_size .getSecond ().getitem (0 );
950
- Long val_nelements =
951
- val_nbytes .divide (BigInteger .valueOf (val_buffer .getNativeTypeSize ())).longValue ();
952
- result .put (name , new Pair <Long , Long >(off_nelements , val_nelements ));
934
+ // Fixed-sized
935
+ if (entry .getValue ().getFirst () == null ) {
936
+ NativeArray val_buffer = entry .getValue ().getSecond ();
937
+ BigInteger val_nbytes = buffer_sizes_ .get (name ).getSecond ().getitem (0 );
938
+ Long nelements =
939
+ val_nbytes .divide (BigInteger .valueOf (val_buffer .getNativeTypeSize ())).longValue ();
940
+ result .put (name , new Pair <>(0l , nelements ));
941
+ }
942
+ // Var-sized
943
+ else {
944
+ Pair <uint64_tArray , uint64_tArray > buffer_size = buffer_sizes_ .get (name );
945
+
946
+ NativeArray off_buffer = entry .getValue ().getFirst ();
947
+ BigInteger off_nbytes = buffer_size .getFirst ().getitem (0 );
948
+ Long off_nelements =
949
+ off_nbytes .divide (BigInteger .valueOf (off_buffer .getNativeTypeSize ())).longValue ();
950
+
951
+ NativeArray val_buffer = entry .getValue ().getSecond ();
952
+ BigInteger val_nbytes = buffer_size .getSecond ().getitem (0 );
953
+ Long val_nelements =
954
+ val_nbytes .divide (BigInteger .valueOf (val_buffer .getNativeTypeSize ())).longValue ();
955
+ result .put (name , new Pair <Long , Long >(off_nelements , val_nelements ));
956
+ }
953
957
}
954
958
return result ;
955
959
}
@@ -968,12 +972,11 @@ public HashMap<String, Pair<Long, Long>> resultBufferElements() throws TileDBErr
968
972
*/
969
973
public HashMap <String , Pair <Long , Long >> resultBufferSizes () throws TileDBError {
970
974
HashMap <String , Pair <Long , Long >> result = new HashMap <String , Pair <Long , Long >>();
971
- for (Map .Entry <String , NativeArray > entry : buffers_ .entrySet ()) {
972
- String name = entry .getKey ();
975
+ for (String name : buffers_ .keySet ()) {
973
976
BigInteger val_nbytes = buffer_sizes_ .get (name ).getSecond ().getitem (0 );
974
977
result .put (name , new Pair <>(0l , val_nbytes .longValue ()));
975
978
}
976
- for (Map .Entry <String , Pair <NativeArray , NativeArray >> entry : var_buffers_ .entrySet ()) {
979
+ for (Map .Entry <String , Pair <NativeArray , NativeArray >> entry : buffers_ .entrySet ()) {
977
980
String name = entry .getKey ();
978
981
Pair <uint64_tArray , uint64_tArray > buffer_size = buffer_sizes_ .get (name );
979
982
@@ -987,15 +990,15 @@ public HashMap<String, Pair<Long, Long>> resultBufferSizes() throws TileDBError
987
990
988
991
/** Clears all attribute buffers. */
989
992
public synchronized void resetBuffers () {
990
- for (NativeArray buffer : buffers_ .values ()) {
991
- buffer .close ();
993
+ for (Pair < NativeArray , NativeArray > buffer : buffers_ .values ()) {
994
+ buffer .getSecond (). close ();
992
995
}
993
996
buffers_ .clear ();
994
- for (Pair <NativeArray , NativeArray > var_buffer : var_buffers_ .values ()) {
997
+ for (Pair <NativeArray , NativeArray > var_buffer : buffers_ .values ()) {
995
998
var_buffer .getFirst ().close ();
996
999
var_buffer .getSecond ().close ();
997
1000
}
998
- var_buffers_ .clear ();
1001
+ buffers_ .clear ();
999
1002
for (Pair <uint64_tArray , uint64_tArray > size_pair : buffer_sizes_ .values ()) {
1000
1003
size_pair .getFirst ().delete ();
1001
1004
size_pair .getSecond ().delete ();
@@ -1026,7 +1029,7 @@ public Query resetBufferSizes() {
1026
1029
*/
1027
1030
public Object getBuffer (String attr ) throws TileDBError {
1028
1031
if (buffers_ .containsKey (attr )) {
1029
- NativeArray buffer = buffers_ .get (attr );
1032
+ NativeArray buffer = buffers_ .get (attr ). getSecond () ;
1030
1033
Integer nelements =
1031
1034
(buffer_sizes_
1032
1035
.get (attr )
@@ -1035,8 +1038,8 @@ public Object getBuffer(String attr) throws TileDBError {
1035
1038
.divide (BigInteger .valueOf (buffer .getNativeTypeSize ())))
1036
1039
.intValue ();
1037
1040
return buffer .toJavaArray (nelements );
1038
- } else if (var_buffers_ .containsKey (attr )) {
1039
- NativeArray buffer = var_buffers_ .get (attr ).getSecond ();
1041
+ } else if (buffers_ .containsKey (attr )) {
1042
+ NativeArray buffer = buffers_ .get (attr ).getSecond ();
1040
1043
Integer nelements =
1041
1044
(buffer_sizes_
1042
1045
.get (attr )
@@ -1070,10 +1073,10 @@ public Pair<ByteBuffer, ByteBuffer> getByteBuffer(String attr) throws TileDBErro
1070
1073
* @throws TileDBError A TileDB exception
1071
1074
*/
1072
1075
public long [] getVarBuffer (String attr ) throws TileDBError {
1073
- if (!var_buffers_ .containsKey (attr )) {
1076
+ if (!buffers_ .containsKey (attr )) {
1074
1077
throw new TileDBError ("Query variable attribute buffer does not exist: " + attr );
1075
1078
}
1076
- NativeArray buffer = var_buffers_ .get (attr ).getFirst ();
1079
+ NativeArray buffer = buffers_ .get (attr ).getFirst ();
1077
1080
Integer nelements =
1078
1081
(buffer_sizes_
1079
1082
.get (attr )
@@ -1122,12 +1125,9 @@ public synchronized void close() {
1122
1125
size_pair .getFirst ().delete ();
1123
1126
size_pair .getSecond ().delete ();
1124
1127
}
1125
- for (NativeArray buffer : buffers_ .values ()) {
1126
- buffer .close ();
1127
- }
1128
- for (Pair <NativeArray , NativeArray > var_buffer : var_buffers_ .values ()) {
1129
- var_buffer .getFirst ().close ();
1130
- var_buffer .getSecond ().close ();
1128
+ for (Pair <NativeArray , NativeArray > buffer : buffers_ .values ()) {
1129
+ if (buffer .getFirst () != null ) buffer .getFirst ().close ();
1130
+ if (buffer .getSecond () != null ) buffer .getSecond ().close ();
1131
1131
}
1132
1132
if (subarray != null ) {
1133
1133
subarray .close ();
0 commit comments