Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 56298200BF4 for ; Fri, 6 Jan 2017 18:36:31 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 54B6C160B39; Fri, 6 Jan 2017 17:36:31 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 9CB54160B37 for ; Fri, 6 Jan 2017 18:36:30 +0100 (CET) Received: (qmail 98995 invoked by uid 500); 6 Jan 2017 17:36:29 -0000 Mailing-List: contact issues-help@carbondata.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@carbondata.incubator.apache.org Delivered-To: mailing list issues@carbondata.incubator.apache.org Received: (qmail 98986 invoked by uid 99); 6 Jan 2017 17:36:29 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Jan 2017 17:36:29 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 47425C0D26 for ; Fri, 6 Jan 2017 17:36:29 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -7.019 X-Spam-Level: X-Spam-Status: No, score=-7.019 tagged_above=-999 required=6.31 tests=[KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id xUtUk8rdfCdr for ; Fri, 6 Jan 2017 17:36:28 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 71A1F5F23D for ; Fri, 6 Jan 2017 17:36:27 +0000 (UTC) Received: (qmail 98963 invoked by uid 99); 6 Jan 2017 17:36:26 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Jan 2017 17:36:26 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8B8F6DF9FD; Fri, 6 Jan 2017 17:36:26 +0000 (UTC) From: zzcclp To: issues@carbondata.incubator.apache.org Reply-To: issues@carbondata.incubator.apache.org References: In-Reply-To: Subject: [GitHub] incubator-carbondata pull request #492: [CARBONDATA-440] Providing the updat... Content-Type: text/plain Message-Id: <20170106173626.8B8F6DF9FD@git1-us-west.apache.org> Date: Fri, 6 Jan 2017 17:36:26 +0000 (UTC) archived-at: Fri, 06 Jan 2017 17:36:31 -0000 Github user zzcclp commented on a diff in the pull request: https://github.com/apache/incubator-carbondata/pull/492#discussion_r94985585 --- Diff: integration/spark/src/main/scala/org/apache/spark/sql/optimizer/CarbonOptimizer.scala --- @@ -72,23 +74,71 @@ object CarbonOptimizer { class ResolveCarbonFunctions(relations: Seq[CarbonDecoderRelation]) extends Rule[LogicalPlan] with PredicateHelper { val LOGGER = LogServiceFactory.getLogService(this.getClass.getName) - def apply(plan: LogicalPlan): LogicalPlan = { - if (relations.nonEmpty && !isOptimized(plan)) { + def apply(logicalPlan: LogicalPlan): LogicalPlan = { + if (relations.nonEmpty && !isOptimized(logicalPlan)) { + val plan = processPlan(logicalPlan) + val udfTransformedPlan = pushDownUDFToJoinLeftRelation(plan) LOGGER.info("Starting to optimize plan") val recorder = CarbonTimeStatisticsFactory.createExecutorRecorder("") val queryStatistic = new QueryStatistic() - val result = transformCarbonPlan(plan, relations) + val result = transformCarbonPlan(udfTransformedPlan, relations) queryStatistic.addStatistics("Time taken for Carbon Optimizer to optimize: ", System.currentTimeMillis) recorder.recordStatistics(queryStatistic) recorder.logStatistics() result } else { LOGGER.info("Skip CarbonOptimizer") - plan + logicalPlan } } + private def processPlan(plan: LogicalPlan): LogicalPlan = { + plan transform { + case ProjectForUpdate(table, cols, Seq(updatePlan)) => + var isTransformed = false + val newPlan = updatePlan transform { + case Project(pList, child) if (!isTransformed) => + val (dest: Seq[NamedExpression], source: Seq[NamedExpression]) = pList + .splitAt(pList.size - cols.size) + val diff = cols.diff(dest.map(_.name)) + if (diff.size > 0) { + sys.error(s"Unknown column(s) ${diff.mkString(",")} in table ${table.tableName}") + } + isTransformed = true + Project(dest.filter(a => !cols.contains(a.name)) ++ source, child) + } + ProjectForUpdateCommand(newPlan, table.tableIdentifier) --- End diff -- @ravikiran23 @jackylk UnresolvedRelation.tableIdentifier is a 'Seq[String]' type in Spark-1.5 while in Spark-1.6 it's a 'TableIdentifier' type, so compile unsuccessfully with Spark-1.6. --- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastructure@apache.org or file a JIRA ticket with INFRA. ---