original_string: public function handle()
      {
          $this->checkSiteExists($this->request);
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::manipulateRequest()...");
  
              $processor->manipulateRequest($this->request);
          }
  
          $this->visitProperties = new VisitProperties();
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::processRequestParams()...");
  
              $abort = $processor->processRequestParams($this->visitProperties, $this->request);
              if ($abort) {
                  Common::printDebug("-> aborting due to processRequestParams method");
                  return;
              }
          }
  
          $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
          if (!$isNewVisit) {
              $isNewVisit = $this->triggerPredicateHookOnDimensions($this->getAllVisitDimensions(), 'shouldForceNewVisit');
              $this->request->setMetadata('CoreHome', 'isNewVisit', $isNewVisit);
          }
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::afterRequestProcessed()...");
  
              $abort = $processor->afterRequestProcessed($this->visitProperties, $this->request);
              if ($abort) {
                  Common::printDebug("-> aborting due to afterRequestProcessed method");
                  return;
              }
          }
  
          $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
  
          // Known visit when:
          // ( - the visitor has the Piwik cookie with the idcookie ID used by Piwik to match the visitor
          //   OR
          //   - the visitor doesn't have the Piwik cookie but could be match using heuristics @see recognizeTheVisitor()
          // )
          // AND
          // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit()
          if (!$isNewVisit) {
              try {
                  $this->handleExistingVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
              } catch (VisitorNotFoundInDb $e) {
                  $this->request->setMetadata('CoreHome', 'visitorNotFoundInDb', true); // TODO: perhaps we should just abort here?
              }
          }
  
          // New visit when:
          // - the visitor has the Piwik cookie but the last action was performed more than 30 min ago @see isLastActionInTheSameVisit()
          // - the visitor doesn't have the Piwik cookie, and couldn't be matched in @see recognizeTheVisitor()
          // - the visitor does have the Piwik cookie but the idcookie and idvisit found in the cookie didn't match to any existing visit in the DB
          if ($isNewVisit) {
              $this->handleNewVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
          }
  
          // update the cookie with the new visit information
          $this->request->setThirdPartyCookie($this->request->getVisitorIdForThirdPartyCookie());
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::recordLogs()...");
  
              $processor->recordLogs($this->visitProperties, $this->request);
          }
  
          $this->markArchivedReportsAsInvalidIfArchiveAlreadyFinished();
      }
code: public function handle()
      {
          $this->checkSiteExists($this->request);
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::manipulateRequest()...");
  
              $processor->manipulateRequest($this->request);
          }
  
          $this->visitProperties = new VisitProperties();
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::processRequestParams()...");
  
              $abort = $processor->processRequestParams($this->visitProperties, $this->request);
              if ($abort) {
                  Common::printDebug("-> aborting due to processRequestParams method");
                  return;
              }
          }
  
          $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
          if (!$isNewVisit) {
              $isNewVisit = $this->triggerPredicateHookOnDimensions($this->getAllVisitDimensions(), 'shouldForceNewVisit');
              $this->request->setMetadata('CoreHome', 'isNewVisit', $isNewVisit);
          }
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::afterRequestProcessed()...");
  
              $abort = $processor->afterRequestProcessed($this->visitProperties, $this->request);
              if ($abort) {
                  Common::printDebug("-> aborting due to afterRequestProcessed method");
                  return;
              }
          }
  
          $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
  
          // Known visit when:
          // ( - the visitor has the Piwik cookie with the idcookie ID used by Piwik to match the visitor
          //   OR
          //   - the visitor doesn't have the Piwik cookie but could be match using heuristics @see recognizeTheVisitor()
          // )
          // AND
          // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit()
          if (!$isNewVisit) {
              try {
                  $this->handleExistingVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
              } catch (VisitorNotFoundInDb $e) {
                  $this->request->setMetadata('CoreHome', 'visitorNotFoundInDb', true); // TODO: perhaps we should just abort here?
              }
          }
  
          // New visit when:
          // - the visitor has the Piwik cookie but the last action was performed more than 30 min ago @see isLastActionInTheSameVisit()
          // - the visitor doesn't have the Piwik cookie, and couldn't be matched in @see recognizeTheVisitor()
          // - the visitor does have the Piwik cookie but the idcookie and idvisit found in the cookie didn't match to any existing visit in the DB
          if ($isNewVisit) {
              $this->handleNewVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
          }
  
          // update the cookie with the new visit information
          $this->request->setThirdPartyCookie($this->request->getVisitorIdForThirdPartyCookie());
  
          foreach ($this->requestProcessors as $processor) {
              Common::printDebug("Executing " . get_class($processor) . "::recordLogs()...");
  
              $processor->recordLogs($this->visitProperties, $this->request);
          }
  
          $this->markArchivedReportsAsInvalidIfArchiveAlreadyFinished();
      }
code_tokens: public function handle ( ) { $ this -> checkSiteExists ( $ this -> request ) ; foreach ( $ this -> requestProcessors as $ processor ) { Common :: printDebug ( "Executing " . get_class ( $ processor ) . "::manipulateRequest()..." ) ; $ processor -> manipulateRequest ( $ this -> request ) ; } $ this -> visitProperties = new VisitProperties ( ) ; foreach ( $ this -> requestProcessors as $ processor ) { Common :: printDebug ( "Executing " . get_class ( $ processor ) . "::processRequestParams()..." ) ; $ abort = $ processor -> processRequestParams ( $ this -> visitProperties , $ this -> request ) ; if ( $ abort ) { Common :: printDebug ( "-> aborting due to processRequestParams method" ) ; return ; } } $ isNewVisit = $ this -> request -> getMetadata ( 'CoreHome' , 'isNewVisit' ) ; if ( ! $ isNewVisit ) { $ isNewVisit = $ this -> triggerPredicateHookOnDimensions ( $ this -> getAllVisitDimensions ( ) , 'shouldForceNewVisit' ) ; $ this -> request -> setMetadata ( 'CoreHome' , 'isNewVisit' , $ isNewVisit ) ; } foreach ( $ this -> requestProcessors as $ processor ) { Common :: printDebug ( "Executing " . get_class ( $ processor ) . "::afterRequestProcessed()..." ) ; $ abort = $ processor -> afterRequestProcessed ( $ this -> visitProperties , $ this -> request ) ; if ( $ abort ) { Common :: printDebug ( "-> aborting due to afterRequestProcessed method" ) ; return ; } } $ isNewVisit = $ this -> request -> getMetadata ( 'CoreHome' , 'isNewVisit' ) ; // Known visit when: // ( - the visitor has the Piwik cookie with the idcookie ID used by Piwik to match the visitor //   OR //   - the visitor doesn't have the Piwik cookie but could be match using heuristics @see recognizeTheVisitor() // ) // AND // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit() if ( ! $ isNewVisit ) { try { $ this -> handleExistingVisit ( $ this -> request -> getMetadata ( 'Goals' , 'visitIsConverted' ) ) ; } catch ( VisitorNotFoundInDb $ e ) { $ this -> request -> setMetadata ( 'CoreHome' , 'visitorNotFoundInDb' , true ) ; // TODO: perhaps we should just abort here? } } // New visit when: // - the visitor has the Piwik cookie but the last action was performed more than 30 min ago @see isLastActionInTheSameVisit() // - the visitor doesn't have the Piwik cookie, and couldn't be matched in @see recognizeTheVisitor() // - the visitor does have the Piwik cookie but the idcookie and idvisit found in the cookie didn't match to any existing visit in the DB if ( $ isNewVisit ) { $ this -> handleNewVisit ( $ this -> request -> getMetadata ( 'Goals' , 'visitIsConverted' ) ) ; } // update the cookie with the new visit information $ this -> request -> setThirdPartyCookie ( $ this -> request -> getVisitorIdForThirdPartyCookie ( ) ) ; foreach ( $ this -> requestProcessors as $ processor ) { Common :: printDebug ( "Executing " . get_class ( $ processor ) . "::recordLogs()..." ) ; $ processor -> recordLogs ( $ this -> visitProperties , $ this -> request ) ; } $ this -> markArchivedReportsAsInvalidIfArchiveAlreadyFinished ( ) ; }
docstring: Main algorithm to handle the visit.
  
  Once we have the visitor information, we have to determine if the visit is a new or a known visit.
  
  1) When the last action was done more than 30min ago,
  or if the visitor is new, then this is a new visit.
  
  2) If the last action is less than 30min ago, then the same visit is going on.
  Because the visit goes on, we can get the time spent during the last action.
  
  NB:
  - In the case of a new visit, then the time spent
  during the last action of the previous visit is unknown.
  
  - In the case of a new visit but with a known visitor,
  we can set the 'returning visitor' flag.
  
  In all the cases we set a cookie to the visitor with the new information.
docstring_tokens: Main algorithm to handle the visit .