github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/causetstore/petri/acyclic/bindinfo/session_handle.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package bindinfo
    15  
    16  import (
    17  	"time"
    18  
    19  	"github.com/whtcorpsinc/BerolinaSQL"
    20  	"github.com/whtcorpsinc/BerolinaSQL/allegrosql"
    21  	"github.com/whtcorpsinc/milevadb/metrics"
    22  	"github.com/whtcorpsinc/milevadb/stochastikctx"
    23  	"github.com/whtcorpsinc/milevadb/types"
    24  )
    25  
    26  // StochastikHandle is used to handle all stochastik allegrosql bind operations.
    27  type StochastikHandle struct {
    28  	ch     cache
    29  	BerolinaSQL *BerolinaSQL.BerolinaSQL
    30  }
    31  
    32  // NewStochastikBindHandle creates a new StochastikBindHandle.
    33  func NewStochastikBindHandle(BerolinaSQL *BerolinaSQL.BerolinaSQL) *StochastikHandle {
    34  	stochastikHandle := &StochastikHandle{BerolinaSQL: BerolinaSQL}
    35  	stochastikHandle.ch = make(cache)
    36  	return stochastikHandle
    37  }
    38  
    39  // appendBindRecord adds the BindRecord to the cache, all the stale bindMetas are
    40  // removed from the cache after this operation.
    41  func (h *StochastikHandle) appendBindRecord(hash string, spacetime *BindRecord) {
    42  	oldRecord := h.ch.getBindRecord(hash, spacetime.OriginalALLEGROSQL, spacetime.EDB)
    43  	h.ch.setBindRecord(hash, spacetime)
    44  	uFIDelateMetrics(metrics.ScopeStochastik, oldRecord, spacetime, false)
    45  }
    46  
    47  // CreateBindRecord creates a BindRecord to the cache.
    48  // It replaces all the exists bindings for the same normalized ALLEGROALLEGROSQL.
    49  func (h *StochastikHandle) CreateBindRecord(sctx stochastikctx.Context, record *BindRecord) (err error) {
    50  	err = record.prepareHints(sctx)
    51  	if err != nil {
    52  		return err
    53  	}
    54  	now := types.NewTime(types.FromGoTime(time.Now().In(sctx.GetStochastikVars().StmtCtx.TimeZone)), allegrosql.TypeTimestamp, 3)
    55  	for i := range record.Bindings {
    56  		record.Bindings[i].CreateTime = now
    57  		record.Bindings[i].UFIDelateTime = now
    58  	}
    59  
    60  	// uFIDelate the BindMeta to the cache.
    61  	h.appendBindRecord(BerolinaSQL.DigestNormalized(record.OriginalALLEGROSQL), record)
    62  	return nil
    63  }
    64  
    65  // DropBindRecord drops a BindRecord in the cache.
    66  func (h *StochastikHandle) DropBindRecord(originalALLEGROSQL, EDB string, binding *Binding) error {
    67  	oldRecord := h.GetBindRecord(originalALLEGROSQL, EDB)
    68  	var newRecord *BindRecord
    69  	record := &BindRecord{OriginalALLEGROSQL: originalALLEGROSQL, EDB: EDB}
    70  	if binding != nil {
    71  		record.Bindings = append(record.Bindings, *binding)
    72  	}
    73  	if oldRecord != nil {
    74  		newRecord = oldRecord.remove(record)
    75  	} else {
    76  		newRecord = record
    77  	}
    78  	h.ch.setBindRecord(BerolinaSQL.DigestNormalized(record.OriginalALLEGROSQL), newRecord)
    79  	uFIDelateMetrics(metrics.ScopeStochastik, oldRecord, newRecord, false)
    80  	return nil
    81  }
    82  
    83  // GetBindRecord return the BindMeta of the (normdOrigALLEGROSQL,EDB) if BindMeta exist.
    84  func (h *StochastikHandle) GetBindRecord(normdOrigALLEGROSQL, EDB string) *BindRecord {
    85  	hash := BerolinaSQL.DigestNormalized(normdOrigALLEGROSQL)
    86  	bindRecords := h.ch[hash]
    87  	for _, bindRecord := range bindRecords {
    88  		if bindRecord.OriginalALLEGROSQL == normdOrigALLEGROSQL && bindRecord.EDB == EDB {
    89  			return bindRecord
    90  		}
    91  	}
    92  	return nil
    93  }
    94  
    95  // GetAllBindRecord return all stochastik bind info.
    96  func (h *StochastikHandle) GetAllBindRecord() (bindRecords []*BindRecord) {
    97  	for _, bindRecord := range h.ch {
    98  		bindRecords = append(bindRecords, bindRecord...)
    99  	}
   100  	return bindRecords
   101  }
   102  
   103  // Close closes the stochastik handle.
   104  func (h *StochastikHandle) Close() {
   105  	for _, bindRecords := range h.ch {
   106  		for _, bindRecord := range bindRecords {
   107  			uFIDelateMetrics(metrics.ScopeStochastik, bindRecord, nil, false)
   108  		}
   109  	}
   110  }
   111  
   112  // stochastikBindInfoKeyType is a dummy type to avoid naming collision in context.
   113  type stochastikBindInfoKeyType int
   114  
   115  // String defines a Stringer function for debugging and pretty printing.
   116  func (k stochastikBindInfoKeyType) String() string {
   117  	return "stochastik_bindinfo"
   118  }
   119  
   120  // StochastikBindInfoKeyType is a variable key for causetstore stochastik bind info.
   121  const StochastikBindInfoKeyType stochastikBindInfoKeyType = 0