[ASTERIXDB-3404][RT] Do not apply columnar filter on antimatter
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
Ignore antimatter tuples when processing columnar filters
Change-Id: Ica578dac11eba9311d65c47f38cc119811a7dcad
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18309
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Wail Alkowaileet <wael.y.k@gmail.com>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.001.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.001.ddl.sqlpp
new file mode 100644
index 0000000..a271778
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.001.ddl.sqlpp
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+DROP DATAVERSE test if exists;
+CREATE DATAVERSE test;
+USE test;
+
+CREATE TYPE ColumnType AS {
+ id: int
+};
+
+CREATE DATASET ColumnDataset(ColumnType)
+PRIMARY KEY id WITH {
+ "storage-format": {"format" : "column"}
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.002.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.002.update.sqlpp
new file mode 100644
index 0000000..23f368a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.002.update.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * 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 test;
+
+UPSERT INTO ColumnDataset (
+ SELECT VALUE {"id": x, "a": x}
+ FROM RANGE (1, 32) x
+);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.003.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.003.get.http
new file mode 100644
index 0000000..57d830a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.003.get.http
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.004.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.004.update.sqlpp
new file mode 100644
index 0000000..8a84d36
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.004.update.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * 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 test;
+
+DELETE FROM ColumnDataset
+WHERE a MOD 2 = 0;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.005.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.005.update.sqlpp
new file mode 100644
index 0000000..37f50b5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.005.update.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * 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 test;
+
+UPSERT INTO ColumnDataset (
+ SELECT VALUE {"id": x, "a": x}
+ FROM RANGE (1, 32) x
+ WHERE x MOD 2 = 1
+);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.006.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.006.get.http
new file mode 100644
index 0000000..57d830a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.006.get.http
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+/connector?dataverseName=test&datasetName=ColumnDataset
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.007.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.007.query.sqlpp
new file mode 100644
index 0000000..f7f794f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.007.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.008.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.008.query.sqlpp
new file mode 100644
index 0000000..3c55c72
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.008.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 = 0
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.009.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.009.query.sqlpp
new file mode 100644
index 0000000..8ef187a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.009.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 = 1
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.010.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.010.query.sqlpp
new file mode 100644
index 0000000..f9d28ce
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.010.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 = 2
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.011.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.011.query.sqlpp
new file mode 100644
index 0000000..61c0def
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.011.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 != 0
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.012.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.012.query.sqlpp
new file mode 100644
index 0000000..ce57d42
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.012.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 != 1
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.013.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.013.query.sqlpp
new file mode 100644
index 0000000..3d5765b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.013.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 3 != 2
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.014.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.014.query.sqlpp
new file mode 100644
index 0000000..8f5f165
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.014.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 2 = 0
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.015.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.015.query.sqlpp
new file mode 100644
index 0000000..a1b871c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/filter/delete/delete.015.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * 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 test;
+SET `compiler.column.filter` "true";
+
+
+
+SELECT VALUE d
+FROM ColumnDataset d
+WHERE a MOD 2 != 0
+ORDER by d.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.003.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.003.regexadm
new file mode 100644
index 0000000..81882d4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.003.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"ColumnType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.006.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.006.regexadm
new file mode 100644
index 0000000..81882d4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.006.regexadm
@@ -0,0 +1 @@
+\Q{"keys":"id","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"ColumnType","open":true,"fields":[{"id":{"type":"AInt64"}}]},"splits":[\E.*\Q]}\E
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.007.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.007.adm
new file mode 100644
index 0000000..9b5244c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.007.adm
@@ -0,0 +1,16 @@
+{ "id": 1, "a": 1 }
+{ "id": 3, "a": 3 }
+{ "id": 5, "a": 5 }
+{ "id": 7, "a": 7 }
+{ "id": 9, "a": 9 }
+{ "id": 11, "a": 11 }
+{ "id": 13, "a": 13 }
+{ "id": 15, "a": 15 }
+{ "id": 17, "a": 17 }
+{ "id": 19, "a": 19 }
+{ "id": 21, "a": 21 }
+{ "id": 23, "a": 23 }
+{ "id": 25, "a": 25 }
+{ "id": 27, "a": 27 }
+{ "id": 29, "a": 29 }
+{ "id": 31, "a": 31 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.008.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.008.adm
new file mode 100644
index 0000000..1e05777
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.008.adm
@@ -0,0 +1,5 @@
+{ "id": 3, "a": 3 }
+{ "id": 9, "a": 9 }
+{ "id": 15, "a": 15 }
+{ "id": 21, "a": 21 }
+{ "id": 27, "a": 27 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.009.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.009.adm
new file mode 100644
index 0000000..ac77f39
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.009.adm
@@ -0,0 +1,6 @@
+{ "id": 1, "a": 1 }
+{ "id": 7, "a": 7 }
+{ "id": 13, "a": 13 }
+{ "id": 19, "a": 19 }
+{ "id": 25, "a": 25 }
+{ "id": 31, "a": 31 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.010.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.010.adm
new file mode 100644
index 0000000..c13bcec
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.010.adm
@@ -0,0 +1,5 @@
+{ "id": 5, "a": 5 }
+{ "id": 11, "a": 11 }
+{ "id": 17, "a": 17 }
+{ "id": 23, "a": 23 }
+{ "id": 29, "a": 29 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.011.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.011.adm
new file mode 100644
index 0000000..864fabe
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.011.adm
@@ -0,0 +1,11 @@
+{ "id": 1, "a": 1 }
+{ "id": 5, "a": 5 }
+{ "id": 7, "a": 7 }
+{ "id": 11, "a": 11 }
+{ "id": 13, "a": 13 }
+{ "id": 17, "a": 17 }
+{ "id": 19, "a": 19 }
+{ "id": 23, "a": 23 }
+{ "id": 25, "a": 25 }
+{ "id": 29, "a": 29 }
+{ "id": 31, "a": 31 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.012.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.012.adm
new file mode 100644
index 0000000..1382720
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.012.adm
@@ -0,0 +1,10 @@
+{ "id": 3, "a": 3 }
+{ "id": 5, "a": 5 }
+{ "id": 9, "a": 9 }
+{ "id": 11, "a": 11 }
+{ "id": 15, "a": 15 }
+{ "id": 17, "a": 17 }
+{ "id": 21, "a": 21 }
+{ "id": 23, "a": 23 }
+{ "id": 27, "a": 27 }
+{ "id": 29, "a": 29 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.013.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.013.adm
new file mode 100644
index 0000000..5ab1d99
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.013.adm
@@ -0,0 +1,11 @@
+{ "id": 1, "a": 1 }
+{ "id": 3, "a": 3 }
+{ "id": 7, "a": 7 }
+{ "id": 9, "a": 9 }
+{ "id": 13, "a": 13 }
+{ "id": 15, "a": 15 }
+{ "id": 19, "a": 19 }
+{ "id": 21, "a": 21 }
+{ "id": 25, "a": 25 }
+{ "id": 27, "a": 27 }
+{ "id": 31, "a": 31 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.014.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.014.adm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.014.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.015.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.015.adm
new file mode 100644
index 0000000..9b5244c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/filter/delete/delete.015.adm
@@ -0,0 +1,16 @@
+{ "id": 1, "a": 1 }
+{ "id": 3, "a": 3 }
+{ "id": 5, "a": 5 }
+{ "id": 7, "a": 7 }
+{ "id": 9, "a": 9 }
+{ "id": 11, "a": 11 }
+{ "id": 13, "a": 13 }
+{ "id": 15, "a": 15 }
+{ "id": 17, "a": 17 }
+{ "id": 19, "a": 19 }
+{ "id": 21, "a": 21 }
+{ "id": 23, "a": 23 }
+{ "id": 25, "a": 25 }
+{ "id": 27, "a": 27 }
+{ "id": 29, "a": 29 }
+{ "id": 31, "a": 31 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 6e19f2b..7e2259b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -16389,6 +16389,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="column">
+ <compilation-unit name="filter/delete">
+ <output-dir compare="Text">filter/delete</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="column">
<compilation-unit name="filter/not-in_every">
<output-dir compare="Text">filter/not-in_every</output-dir>
</compilation-unit>
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FalseColumnFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FalseColumnFilterEvaluator.java
index f53208b..51f125b 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FalseColumnFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FalseColumnFilterEvaluator.java
@@ -42,6 +42,11 @@
}
@Override
+ public int getValueIndex() {
+ return -1;
+ }
+
+ @Override
public void setAt(int index) {
// NoOp
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
index af64325..db1862c 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/FilterAccessorProvider.java
@@ -52,6 +52,7 @@
private final ObjectSchemaNode root;
private final ObjectSchemaNode metaRoot;
private final SchemaClipperVisitor clipperVisitor;
+ private final IColumnValuesReaderFactory readerFactory;
private final PathExtractorVisitor pathExtractorVisitor;
private final Map<ARecordType, PrimitiveSchemaNode> cachedNodes;
private final List<IColumnRangeFilterValueAccessor> filterAccessors;
@@ -68,6 +69,7 @@
this.root = root;
this.metaRoot = metaRoot;
this.clipperVisitor = clipperVisitor;
+ this.readerFactory = readerFactory;
this.valueGetterFactory = valueGetterFactory;
pathExtractorVisitor = new PathExtractorVisitor(readerFactory);
cachedNodes = new HashMap<>();
@@ -122,6 +124,12 @@
return new UnionColumnFilterValueAccessorEvaluator(unionReaders, valueGetters);
}
+ public void initializeFilterReaders() {
+ // This primary key level reader will help us avoid skipping filter values when an anti-matter is encountered
+ IColumnValuesReader primaryKeyLevelReader = readerFactory.createValueReader(ATypeTag.MISSING, 0, 1, true);
+ filterColumnReaders.add(0, primaryKeyLevelReader);
+ }
+
public List<IColumnRangeFilterValueAccessor> getFilterAccessors() {
return filterAccessors;
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/TrueColumnFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/TrueColumnFilterEvaluator.java
index 86ccab3..0841e01 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/TrueColumnFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/TrueColumnFilterEvaluator.java
@@ -46,6 +46,11 @@
}
@Override
+ public int getValueIndex() {
+ return -1;
+ }
+
+ @Override
public void setAt(int index) {
// NoOp
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluator.java
index 67eb135..1d2838e 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/IColumnIterableFilterEvaluator.java
@@ -26,5 +26,7 @@
int getTupleIndex();
+ int getValueIndex();
+
void setAt(int index) throws HyracksDataException;
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/AbstractIterableFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/AbstractIterableFilterEvaluator.java
index 9ebb7b7..a992090 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/AbstractIterableFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/AbstractIterableFilterEvaluator.java
@@ -18,7 +18,10 @@
*/
package org.apache.asterix.column.filter.iterable.evaluator;
+import java.util.List;
+
import org.apache.asterix.column.filter.iterable.IColumnIterableFilterEvaluator;
+import org.apache.asterix.column.values.IColumnValuesReader;
import org.apache.asterix.formats.nontagged.BinaryBooleanInspector;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -26,33 +29,78 @@
abstract class AbstractIterableFilterEvaluator implements IColumnIterableFilterEvaluator {
protected final IScalarEvaluator evaluator;
+ protected final IColumnValuesReader primaryKeyReader;
+ protected final List<IColumnValuesReader> readers;
private final VoidPointable booleanResult;
- protected int index;
+ protected int tupleIndex;
+ protected int valueIndex;
- AbstractIterableFilterEvaluator(IScalarEvaluator evaluator) {
+ AbstractIterableFilterEvaluator(IScalarEvaluator evaluator, List<IColumnValuesReader> readers) {
this.evaluator = evaluator;
+ this.primaryKeyReader = readers.get(0);
+ this.readers = readers;
this.booleanResult = new VoidPointable();
reset();
}
@Override
public final void reset() {
- index = -1;
+ tupleIndex = -1;
+ valueIndex = -1;
}
@Override
public final int getTupleIndex() {
- return index;
+ return tupleIndex;
+ }
+
+ @Override
+ public int getValueIndex() {
+ return valueIndex;
}
@Override
public final void setAt(int index) throws HyracksDataException {
- int count = index - this.index;
- // count - 1 as we want to evaluate the value at 'index'
- skip(count - 1);
+ // -1 as we want to evaluate the value at 'index'
+ int count = index - this.tupleIndex - 1;
+ if (count > 0) {
+ tupleIndex += count - 1;
+ // skip(int) returns the number of skipped values (i.e., without anti-matters)
+ valueIndex += skip(count - 1);
+ }
}
- protected abstract void skip(int count) throws HyracksDataException;
+ protected final boolean next() throws HyracksDataException {
+ // start from 1 as 0 is reserved for the primary key level reader
+ boolean advance = true;
+ while (advance) {
+ advance = primaryKeyReader.next() && primaryKeyReader.isMissing();
+ // Advance tuple index
+ tupleIndex++;
+ }
+
+ // Advance value index
+ valueIndex++;
+ for (int i = 1; i < readers.size(); i++) {
+ if (!readers.get(i).next()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected final int skip(int count) throws HyracksDataException {
+ // Count non-anti-matter tuples
+ int nonAntiMatterCount = 0;
+ for (int i = 0; i < count; i++) {
+ primaryKeyReader.next();
+ nonAntiMatterCount += primaryKeyReader.isValue() ? 0 : 1;
+ }
+ for (int i = 1; nonAntiMatterCount > 0 && i < readers.size(); i++) {
+ readers.get(i).skip(nonAntiMatterCount);
+ }
+ return nonAntiMatterCount;
+ }
protected final boolean inspect() throws HyracksDataException {
evaluator.evaluate(null, booleanResult);
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluator.java
index 2878429..094b2bf 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluator.java
@@ -25,11 +25,9 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
public class ColumnIterableFilterEvaluator extends AbstractIterableFilterEvaluator {
- private final List<IColumnValuesReader> readers;
public ColumnIterableFilterEvaluator(IScalarEvaluator evaluator, List<IColumnValuesReader> readers) {
- super(evaluator);
- this.readers = readers;
+ super(evaluator, readers);
}
@Override
@@ -37,28 +35,12 @@
boolean result = false;
while (!result && next()) {
result = inspect();
- index++;
}
if (!result) {
// Last tuple does not satisfy the condition
- index++;
+ tupleIndex++;
+ valueIndex++;
}
return result;
}
-
- private boolean next() throws HyracksDataException {
- for (int i = 0; i < readers.size(); i++) {
- if (!readers.get(i).next()) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public void skip(int count) throws HyracksDataException {
- for (int i = 0; count > 0 && i < readers.size(); i++) {
- readers.get(i).skip(count);
- }
- }
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
index 44441dd..2fd92e8 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnIterableFilterEvaluatorFactory.java
@@ -48,6 +48,9 @@
throw new NullPointerException("Readers are empty");
}
+ // Initialize column filter readers by including a primary key level reader
+ filterAccessorProvider.initializeFilterReaders();
+
if (readers.stream().anyMatch(IColumnValuesReader::isRepeated)) {
return new ColumnarRepeatedIterableFilterEvaluator(evaluator, readers);
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnarRepeatedIterableFilterEvaluator.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnarRepeatedIterableFilterEvaluator.java
index 7db9f65..9a1f07f 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnarRepeatedIterableFilterEvaluator.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/filter/iterable/evaluator/ColumnarRepeatedIterableFilterEvaluator.java
@@ -26,12 +26,10 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
public class ColumnarRepeatedIterableFilterEvaluator extends AbstractIterableFilterEvaluator {
- private final List<IColumnValuesReader> readers;
private final List<IColumnValuesReader> repeatedReaders;
ColumnarRepeatedIterableFilterEvaluator(IScalarEvaluator evaluator, List<IColumnValuesReader> readers) {
- super(evaluator);
- this.readers = readers;
+ super(evaluator, readers);
repeatedReaders = new ArrayList<>();
for (IColumnValuesReader reader : readers) {
if (reader.isRepeated()) {
@@ -47,11 +45,11 @@
// TODO handle nested repetition (x = unnest --> y = unnest --> select (x = 1 AND y = 3))
// TODO we need a way to 'rewind' y for each x
result = evaluateRepeated();
- index++;
}
if (!result) {
// Last tuple does not satisfy the condition
- index++;
+ tupleIndex++;
+ valueIndex++;
}
return result;
}
@@ -73,20 +71,4 @@
} while (doNext);
return result;
}
-
- private boolean next() throws HyracksDataException {
- for (int i = 0; i < readers.size(); i++) {
- if (!readers.get(i).next()) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- protected void skip(int count) throws HyracksDataException {
- for (int i = 0; count > 0 && i < readers.size(); i++) {
- readers.get(i).skip(count);
- }
- }
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
index 835bb50..e619ecf 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
@@ -110,7 +110,7 @@
}
public int skip(int count) throws HyracksDataException {
- if (numberOfTuples == 0) {
+ if (numberOfTuples == 0 || count == 0) {
// Avoid advancing tupleIndex and numberOfSkips if a mega leaf node is filtered out
return 0;
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
index 19cb753..7ba0aae 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnTupleReference.java
@@ -157,7 +157,8 @@
// index == -1 if the normalized filter indicated that a mega leaf node
// is filtered
if (index == tupleIndex) {
- assembler.setAt(index);
+ // setAt in the assembler expect the value index (i.e., tupleCount - antiMatterCount)
+ assembler.setAt(columnFilterEvaluator.getValueIndex());
// set the next tuple index that satisfies the filter
columnFilterEvaluator.evaluate();
return assembler.nextValue();
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
index fc1f1d2..1e4aaea 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/tuple/QueryColumnWithMetaTupleReference.java
@@ -176,15 +176,18 @@
private IValueReference getFilteredAssembledValue() throws HyracksDataException {
int index = columnFilterEvaluator.getTupleIndex();
- // index == -1 if the normalized filter indicated that a mega leaf node
- // is filtered
+
+ // index == -1 if the normalized filter indicated that a mega leaf node is filtered
if (index == tupleIndex) {
- assembler.setAt(index);
- metaAssembler.setAt(index);
+ // setAt in the assembler expect the value index (i.e., tupleCount - antiMatterCount)
+ int valueIndex = columnFilterEvaluator.getValueIndex();
+ assembler.setAt(valueIndex);
+ metaAssembler.setAt(valueIndex);
// set the next tuple index that satisfies the filter
columnFilterEvaluator.evaluate();
return assembler.nextValue();
}
+
return MissingValueGetter.MISSING;
}
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReaderFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReaderFactory.java
index 7c41512..c32de2d 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReaderFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/IColumnValuesReaderFactory.java
@@ -52,7 +52,7 @@
*
* @param input column metadata info
* @return columnar reader
- * @see PathInfoSerializer#writePathInfo(ATypeTag, int, boolean) for more information on how the path info is serialized
+ * @see PathInfoSerializer#writePathInfo(ATypeTag, int, boolean) how it serializes the path info
*/
IColumnValuesReader createValueReader(DataInput input) throws IOException;
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
index 133c744..b03da57 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/AbstractColumnValuesReader.java
@@ -57,7 +57,7 @@
AbstractColumnValuesReader(AbstractValueReader valueReader, int columnIndex, int maxLevel, boolean primaryKey) {
this.valueReader = valueReader;
this.columnIndex = columnIndex;
- this.maxLevel = valueReader.getTypeTag() == ATypeTag.MISSING ? Integer.MAX_VALUE : maxLevel;
+ this.maxLevel = !primaryKey && valueReader.getTypeTag() == ATypeTag.MISSING ? Integer.MAX_VALUE : maxLevel;
definitionLevels = new ParquetRunLengthBitPackingHybridDecoder(ColumnValuesUtil.getBitWidth(maxLevel));
valuesStream = primaryKey ? new ByteBufferInputStream() : new MultiByteBufferInputStream();
this.primaryKey = primaryKey;
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
index 3411138..d054b13 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/ColumnValueReaderFactory.java
@@ -33,6 +33,7 @@
import org.apache.asterix.column.values.reader.value.UUIDValueReader;
import org.apache.asterix.column.values.reader.value.key.DoubleKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.FloatKeyValueReader;
+import org.apache.asterix.column.values.reader.value.key.LevelKeyReader;
import org.apache.asterix.column.values.reader.value.key.LongKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.StringKeyValueReader;
import org.apache.asterix.column.values.reader.value.key.UUIDKeyValueReader;
@@ -70,7 +71,7 @@
switch (typeTag) {
case MISSING:
case NULL:
- return NoOpValueReader.INSTANCE;
+ return primaryKey ? LevelKeyReader.INSTANCE : NoOpValueReader.INSTANCE;
case BOOLEAN:
return new BooleanValueReader();
case TINYINT:
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
index 5f28995..f1c2929 100644
--- a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/PrimitiveColumnValuesReader.java
@@ -39,7 +39,7 @@
*/
private final boolean primaryKey;
- public PrimitiveColumnValuesReader(AbstractValueReader reader, int columnIndex, int maxLevel, boolean primaryKey) {
+ PrimitiveColumnValuesReader(AbstractValueReader reader, int columnIndex, int maxLevel, boolean primaryKey) {
super(reader, columnIndex, maxLevel, primaryKey);
this.primaryKey = primaryKey;
}
diff --git a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LevelKeyReader.java b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LevelKeyReader.java
new file mode 100644
index 0000000..dddd0fa
--- /dev/null
+++ b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/values/reader/value/key/LevelKeyReader.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.asterix.column.values.reader.value.key;
+
+import java.io.IOException;
+
+import org.apache.asterix.column.bytes.stream.in.AbstractBytesInputStream;
+import org.apache.asterix.column.values.IColumnKeyValueReader;
+import org.apache.asterix.column.values.reader.value.AbstractValueReader;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IValueReference;
+
+/**
+ * This singleton is used to ignore the key value and provide a way to read the key's level using
+ * {@link org.apache.asterix.column.values.reader.PrimitiveColumnValuesReader}
+ *
+ * @see org.apache.asterix.column.filter.iterable.evaluator.ColumnIterableFilterEvaluatorFactory
+ */
+public final class LevelKeyReader extends AbstractValueReader implements IColumnKeyValueReader {
+ public static final LevelKeyReader INSTANCE = new LevelKeyReader();
+
+ private LevelKeyReader() {
+ }
+
+ @Override
+ public int reset(int startIndex, int skipCount) throws HyracksDataException {
+ return 0;
+ }
+
+ @Override
+ public IValueReference getValue(int index) {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+
+ @Override
+ public void init(AbstractBytesInputStream in, int tupleCount) throws IOException {
+ // NoOp
+ }
+
+ @Override
+ public void nextValue() throws HyracksDataException {
+ // NoOp
+ }
+
+ @Override
+ public ATypeTag getTypeTag() {
+ return ATypeTag.MISSING;
+ }
+
+ @Override
+ public int compareTo(AbstractValueReader o) {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+}