blob: 7f0c6fc807c95a278ccfe9d99a6a676d7aa93b7c [file] [log] [blame]
/**********************************************************************
// @@@ 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_DUPELIM_SINGLE_ROW_RESOLV_H_
#define _RU_DUPELIM_SINGLE_ROW_RESOLV_H_
/* -*-C++-*-
******************************************************************************
*
* File: RuDupElimSingleRowResolv.h
* Description: Definition of class CRUDupElimSingleRowResolver
*
*
* Created: 07/02/2000
* Language: C++
*
*
*
******************************************************************************
*/
#include "RuDupElimTaskExUnit.h"
#include "RuDeltaDef.h"
class CRUDupElimLogScanner;
class CRUIUDLogRecord;
//--------------------------------------------------------------------------//
// CRUDupElimSingleRowResolver
//
// This class resolves duplicate conflicts between single-row records.
// This kind of resolution is required only if the table has an MJV
// "customer". All the other conflicts are handled by CRUDupElimRangeResolver.
//
// The decisions are translated into the Update and Delete
// operations applied to the single-row records in the IUD log.
//
// The single-row resolver allows to complete the DE phase (and commit
// the transaction) only on the duplicate chain boundary (i.e, the records
// that relate to the same clustering key are always processed in the same
// phase).
//
//--------------------------------------------------------------------------//
class REFRESH_LIB_CLASS
CRUDupElimSingleRowResolver : public CRUDupElimResolver {
private:
typedef CRUDupElimResolver inherited;
public:
CRUDupElimSingleRowResolver(
const CRUDupElimGlobals &globals,
CRUSQLDynamicStatementContainer &ctrlStmtContainer);
virtual ~CRUDupElimSingleRowResolver() {}
// Implementation of pure virtuals
public:
//------------------------------------//
// Accessors
//------------------------------------//
#ifdef _DEBUG
virtual void DumpPerformanceStatistics(CDSString &to) const;
#endif
public:
//------------------------------------//
// Mutators
//------------------------------------//
virtual void Reset();
//-- Resolve the next duplicate conflict (including the write to disk).
virtual void Resolve(CRUDupElimLogScanner &scanner);
// Prepare all the SQL statements in the container (together)
virtual void PrepareSQL();
// IPC pack/unpack
virtual void LoadReply(CUOFsIpcMessageTranslator &translator);
virtual void StoreReply(CUOFsIpcMessageTranslator &translator);
//------------------------------------//
// PRIVATE AREA
//------------------------------------//
private:
// The update bitmap common throughout the chain
CRUUpdateBitmap updateBitmap_;
// Is there at least one update in this chain?
BOOL isUpdateRecInChain_;
// Are all records in this chain updates?
BOOL isPureUpdateChain_;
// Statistics for the number of performed IUD statements
Lng32 numDeleteRecord_;
Lng32 numUpdateIgnMark_;
Lng32 numUpdateBitmap_;
Lng32 numUpdateOpType_;
private:
//-- Prevent copying
CRUDupElimSingleRowResolver(const CRUDupElimSingleRowResolver& other);
CRUDupElimSingleRowResolver &operator = (
const CRUDupElimSingleRowResolver& other
);
private:
// Resolve() callees
void EndChain(CRUIUDLogRecord *pLastRecInChain);
void HandleUpdateBitmapAtEndOfChain(CRUIUDLogRecord *pLastRecInChain);
void ResolveInsert(CRUIUDLogRecord *pPrevRec);
void ResolveDelete(
CRUIUDLogRecord *pCurrentRec,
CRUIUDLogRecord *pPrevRec
);
void MonitorUpdate(CRUIUDLogRecord *pCurrentRec);
// Execution of U/D operations on the IUD log
void ExecuteDeleteRecord(CRUIUDLogRecord *pRec);
void ExecuteUpdateIgnMark(CRUIUDLogRecord *pRec);
void ExecuteUpdateBitmapInChain(CRUIUDLogRecord *pLastRecInChain);
void ExecuteUpdateOpTypeInChain(CRUIUDLogRecord *pLastRecInChain);
};
#endif