| /********************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // 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. |
| // |
| // @@@ END COPYRIGHT @@@ |
| // |
| **********************************************************************/ |
| #ifndef _RU_DUP_ELIM_TASK_H_ |
| #define _RU_DUP_ELIM_TASK_H_ |
| |
| /* -*-C++-*- |
| ****************************************************************************** |
| * |
| * File: RuDupElimTask.h |
| * Description: Definition of class CRUDupElimTask |
| * |
| * Created: 8/23/1999 |
| * Language: C++ |
| * |
| * |
| ****************************************************************************** |
| */ |
| |
| #include "refresh.h" |
| |
| #include "RuLogProcessingTask.h" |
| #include "RuDeltaDef.h" |
| |
| //--------------------------------------------------------------------------// |
| // CRUDupElimTask |
| // |
| // The Duplicate Elimination (DE) task class. |
| // |
| // The task's executor performs the duplicate elimination |
| // algorithm on a single table-log. |
| // |
| // The purpose of the duplicate elimination algorithm is to resolve |
| // all the logged operations on each table row (which is identified |
| // by a unique clustering key) into a correct minimum sequence. |
| // |
| // Along with resolving redundancies, duplicate elimination has two |
| // more key purposes. The first one is to extract new ranges from |
| // the IUD log and move them to the range log. |
| // The second one is to collect statistics about the log. This is done |
| // in order to boost the performance of INTERNAL REFRESH. |
| // |
| //--------------------------------------------------------------------------// |
| |
| class REFRESH_LIB_CLASS CRUDupElimTask : public CRULogProcessingTask { |
| |
| private: |
| typedef CRULogProcessingTask inherited; |
| |
| //---------------------------------------// |
| // PUBLIC AREA |
| //---------------------------------------// |
| public: |
| CRUDupElimTask(Lng32 id, CRUTbl &table); |
| virtual ~CRUDupElimTask(); |
| |
| public: |
| //-- Implementation of pure virtual functions |
| virtual CRUTask::Type GetType() const |
| { |
| return CRUTask::DUP_ELIM; |
| } |
| |
| public: |
| TInt32 GetBeginEpoch() const |
| { |
| return beginEpoch_; |
| } |
| TInt32 GetEndEpoch() const |
| { |
| return endEpoch_; |
| } |
| |
| BOOL IsRangeResolv() const |
| { |
| return isRangeResolv_; |
| } |
| BOOL IsSingleRowResolv() const |
| { |
| return isSingleRowResolv_; |
| } |
| |
| CRUDeltaDef::DELevel GetDELevel() const |
| { |
| return deLevel_; |
| } |
| |
| BOOL IsSkipCrossTypeResoultion() const |
| { |
| return isSkipCrossTypeResolution_; |
| } |
| |
| // How much space will be required by statistics data in the IPC buffer? |
| Lng32 GetDeltaStatisticsBufSize() const; |
| |
| // Can Duplicate Elimination be skipped? |
| BOOL NeedToExecuteDE() const; |
| |
| //---------------------------------------// |
| // PRIVATE AND PROTECTED AREA |
| //---------------------------------------// |
| |
| protected: |
| //-- Implementation of pure virtual functions |
| virtual CDSString GetTaskName() const |
| { |
| return "DE(" + GetTable().GetFullName() +")"; |
| } |
| |
| virtual CRUTaskExecutor *CreateExecutorInstance(); |
| |
| virtual void PullDataFromExecutor(); |
| |
| virtual TInt32 GetComputedCost() const |
| { |
| return 0; |
| } |
| |
| virtual BOOL IsImmediate() const |
| { |
| return (FALSE == NeedToExecuteDE()); |
| } |
| |
| private: |
| //-- Prevent copying |
| CRUDupElimTask(const CRUDupElimTask &other); |
| CRUDupElimTask& operator= (const CRUDupElimTask &other); |
| |
| // Setup the internal data structures before the executor is created |
| void SetupDS(); |
| |
| BOOL IsSingleRowResolutionEnforced() const; |
| BOOL IsCrossTypeResolutionEnforced() const; |
| |
| private: |
| // Do we need to apply range/single-row resolution? |
| BOOL isRangeResolv_; |
| BOOL isSingleRowResolv_; |
| BOOL isSkipCrossTypeResolution_; |
| |
| // Epoch boundaries for the duplicate elimination scan |
| TInt32 beginEpoch_; |
| TInt32 endEpoch_; |
| |
| CRUDeltaDef::DELevel deLevel_; |
| }; |
| |
| #endif |