[
https://issues.apache.org/jira/browse/PHOENIX-3534?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16497683#comment-16497683
]
ASF GitHub Bot commented on PHOENIX-3534:
-----------------------------------------
Github user twdsilva commented on a diff in the pull request:
https://github.com/apache/phoenix/pull/303#discussion_r192318109
--- Diff:
phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java
---
@@ -0,0 +1,113 @@
+/**
+ * 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.phoenix.coprocessor;
+
+import static org.apache.phoenix.util.PhoenixRuntime.CONNECTIONLESS;
+import static org.apache.phoenix.util.PhoenixRuntime.JDBC_PROTOCOL;
+import static
org.apache.phoenix.util.PhoenixRuntime.JDBC_PROTOCOL_SEPARATOR;
+
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.BitSet;
+import java.util.List;
+
+import org.apache.phoenix.compile.ColumnResolver;
+import org.apache.phoenix.compile.CreateTableCompiler;
+import org.apache.phoenix.compile.ExpressionCompiler;
+import org.apache.phoenix.compile.FromCompiler;
+import org.apache.phoenix.compile.StatementContext;
+import org.apache.phoenix.compile.WhereCompiler;
+import org.apache.phoenix.expression.Expression;
+import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.jdbc.PhoenixStatement;
+import org.apache.phoenix.parse.ParseNode;
+import org.apache.phoenix.parse.SQLParser;
+import org.apache.phoenix.parse.SelectStatement;
+import org.apache.phoenix.schema.ColumnNotFoundException;
+import org.apache.phoenix.schema.PColumn;
+import org.apache.phoenix.schema.PColumnImpl;
+import org.apache.phoenix.schema.PTable;
+import org.apache.phoenix.schema.PTableImpl;
+import org.apache.phoenix.schema.TableRef;
+import org.apache.phoenix.util.MetaDataUtil;
+
+import com.google.common.collect.Lists;
+
+
+public class WhereConstantParser {
+
+ static PTable addViewInfoToPColumnsIfNeeded(PTable view) throws
SQLException {
+ boolean[] viewColumnConstantsMatched = new
boolean[view.getColumns().size()];
+ byte[][] viewColumnConstantsToBe = new
byte[view.getColumns().size()][];
+ if (view.getViewStatement() == null) {
+ return view;
+ }
+ SelectStatement select = new
SQLParser(view.getViewStatement()).parseQuery();
+ ParseNode whereNode = select.getWhere();
+ ColumnResolver resolver = FromCompiler.getResolver(new
TableRef(view));
+ StatementContext context = new StatementContext(new
PhoenixStatement(getConnectionlessConnection()), resolver);
+ Expression expression = null;
+ try {
+ expression = WhereCompiler.compile(context, whereNode);
+ }
+ catch (ColumnNotFoundException e) {
+ // if we could not find a column used in the view statement
(which means its was dropped)
+ // this view is not valid any more
+ return null;
+ }
+ CreateTableCompiler.ViewWhereExpressionVisitor visitor =
+ new CreateTableCompiler.ViewWhereExpressionVisitor(view,
viewColumnConstantsToBe);
+ expression.accept(visitor);
+
+ BitSet isViewColumnReferencedToBe = new
BitSet(view.getColumns().size());
+ // Used to track column references in a view
+ ExpressionCompiler expressionCompiler = new
CreateTableCompiler.ColumnTrackingExpressionCompiler(context,
isViewColumnReferencedToBe);
+ whereNode.accept(expressionCompiler);
+
+ List<PColumn> result = Lists.newArrayList();
+ for (PColumn column : PTableImpl.getColumnsToClone(view)) {
+ boolean isViewReferenced =
isViewColumnReferencedToBe.get(column.getPosition());
+ if ( (visitor.isUpdatable() ||
view.getPKColumns().get(MetaDataUtil.getAutoPartitionColIndex(view)).equals(column))
+ &&
viewColumnConstantsToBe[column.getPosition()] != null) {
+ result.add(new PColumnImpl(column,
viewColumnConstantsToBe[column.getPosition()], isViewReferenced));
+
viewColumnConstantsMatched[column.getPosition()]=true;
+ }
+ // If view is not updatable, viewColumnConstants should be
empty. We will still
+ // inherit our parent viewConstants, but we have no additional
ones.
+ else if(isViewReferenced ){
+ result.add(new PColumnImpl(column,
column.getViewConstant(), isViewReferenced));
+ }
+ else {
+ result.add(column);
+ }
+ }
+ // ensure that node of the columns in the view where statement
were
+ // dropped in any of this views ancestors
+// for (int i = 0; i < viewColumnConstantsMatched.length; ++i) {
--- End diff --
I removed this code, its not needed.
> Support multi region SYSTEM.CATALOG table
> -----------------------------------------
>
> Key: PHOENIX-3534
> URL: https://issues.apache.org/jira/browse/PHOENIX-3534
> Project: Phoenix
> Issue Type: Bug
> Reporter: James Taylor
> Assignee: Thomas D'Silva
> Priority: Major
> Attachments: PHOENIX-3534-wip.patch
>
>
> Currently Phoenix requires that the SYSTEM.CATALOG table is single region
> based on the server-side row locks being held for operations that impact a
> table and all of it's views. For example, adding/removing a column from a
> base table pushes this change to all views.
> As an alternative to making the SYSTEM.CATALOG transactional (PHOENIX-2431),
> when a new table is created we can do a lazy cleanup of any rows that may be
> left over from a failed DDL call (kudos to [~lhofhansl] for coming up with
> this idea). To implement this efficiently, we'd need to also do PHOENIX-2051
> so that we can efficiently find derived views.
> The implementation would rely on an optimistic concurrency model based on
> checking our sequence numbers for each table/view before/after updating. Each
> table/view row would be individually locked for their change (metadata for a
> view or table cannot span regions due to our split policy), with the sequence
> number being incremented under lock and then returned to the client.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)