[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());
+    }
+}