public function addSegmentOnCache(array $segmentData)
 {
     $segmentName = $segmentData['name'];
     $segmentCache = new SegmentCache();
     if ($segmentCache->getChangeNumber($segmentName) != $segmentData['till']) {
         $segmentCache->addToSegment($segmentName, $segmentData['added']);
         $segmentCache->removeFromSegment($segmentName, $segmentData['removed']);
         $segmentCache->setChangeNumber($segmentName, $segmentData['till']);
     }
     return true;
 }
 /**
  * @depends testSplitCacheInterface
  */
 public function testSegmentCacheInterface()
 {
     $segmentChanges = file_get_contents(__DIR__ . "/../../files/segmentEmployeesChanges.json");
     $this->assertJson($segmentChanges);
     $segmentData = json_decode($segmentChanges, true);
     $segmentName = $segmentData['name'];
     $segmentCache = new SegmentCache();
     $this->assertArrayHasKey('fake_user_id_4', $segmentCache->addToSegment($segmentName, $segmentData['added']));
     $removedResult = $segmentCache->removeFromSegment($segmentName, $segmentData['removed']);
     $this->assertArrayHasKey('fake_user_id_6', $removedResult);
     $this->assertTrue($segmentCache->setChangeNumber($segmentName, $segmentData['till']));
     $this->assertEquals($segmentData['till'], $segmentCache->getChangeNumber($segmentName));
 }
Exemple #3
0
 private function addSegmentsInCache()
 {
     $segmentCache = new SegmentCache();
     //Addinng Employees Segment.
     $segmentEmployeesChanges = file_get_contents(__DIR__ . "/files/segmentEmployeesChanges.json");
     $this->assertJson($segmentEmployeesChanges);
     $segmentData = json_decode($segmentEmployeesChanges, true);
     $this->assertArrayHasKey('employee_1', $segmentCache->addToSegment($segmentData['name'], $segmentData['added']));
     //Adding Human Beigns Segment.
     $segmentHumanBeignsChanges = file_get_contents(__DIR__ . "/files/segmentHumanBeignsChanges.json");
     $this->assertJson($segmentHumanBeignsChanges);
     $segmentData = json_decode($segmentHumanBeignsChanges, true);
     $this->assertArrayHasKey('user1', $segmentCache->addToSegment($segmentData['name'], $segmentData['added']));
 }
Exemple #4
0
 /**
  * @param $key
  * @return bool
  */
 protected function evalKey($key)
 {
     $segmentName = $this->userDefinedSegmentMatcherData;
     $segmentEvaluation = $this->isInCachedSegment($segmentName, $key);
     if ($segmentEvaluation !== null && is_bool($segmentEvaluation)) {
         return $segmentEvaluation;
     } else {
         $segmentCache = new SegmentCache();
         if ($segmentCache->isInSegment($segmentName, $key)) {
             $this->cacheSegmentEvaluation($segmentName, $key, true);
             return true;
         }
         $this->cacheSegmentEvaluation($segmentName, $key, false);
         return false;
     }
 }
 public function execute()
 {
     $registeredSegments = $this->cache()->getItemsOnList(SegmentCache::getCacheKeyForRegisterSegments());
     $log = $this->logger();
     if (is_array($registeredSegments) && !empty($registeredSegments)) {
         foreach ($registeredSegments as $segmentName) {
             $log->info(">>> Fetching data from segment: {$segmentName}");
             $timeStart = Latency::startMeasuringLatency();
             while (true) {
                 $timeStartPart = Latency::startMeasuringLatency();
                 if (!$this->getSplitClient()->updateSegmentChanges($segmentName)) {
                     $timeItTook = Latency::calculateLatency($timeStartPart);
                     $log->debug("Fetching segment last part ({$segmentName}) took {$timeItTook} microseconds");
                     $greedyTime = Latency::calculateLatency($timeStart);
                     $log->info("Finished fetching whole segment {$segmentName}, took {$greedyTime} microseconds");
                     break;
                 }
                 $timeItTook = Latency::calculateLatency($timeStartPart);
                 $log->debug("Fetching segment part ({$segmentName}) took {$timeItTook} microseconds");
                 //Sleep 1/2 second
                 usleep(500000);
             }
         }
         // Setting Segments ready mark
         $dateTimeUTC = new \DateTime("now", new \DateTimeZone("UTC"));
         $bur = new BlockUntilReadyCache();
         $bur->setReadySegments($dateTimeUTC->getTimestamp());
     }
 }
Exemple #6
0
 public function execute()
 {
     //Fetching the Splits changes
     $splitChanges = $this->getSplitClient()->getSplitChanges();
     $splits = isset($splitChanges['splits']) ? $splitChanges['splits'] : array();
     $splitCache = new SplitCache();
     if (!empty($splits)) {
         foreach ($splits as $split) {
             if (!is_array($split) || !isset($split['name']) || !isset($split['conditions']) || !isset($split['status'])) {
                 continue;
                 //continue with next Split
             }
             $this->logger()->debug(print_r($split, true));
             $splitName = $split['name'];
             $splitStatus = $split['status'];
             $splitConditions = $split['conditions'];
             foreach ($splitConditions as $condition) {
                 foreach ($condition['matcherGroup']['matchers'] as $matcher) {
                     if ($matcher['matcherType'] == "IN_SEGMENT") {
                         //Register segment to retrieve Segment Data.
                         SegmentCache::registerSegment($matcher['userDefinedSegmentMatcherData']['segmentName']);
                     }
                 }
             }
             if ($splitStatus == 'ACTIVE') {
                 //Update Cache
                 $splitCache->addSplit($splitName, json_encode($split));
             } else {
                 //Delete item from cache
                 $splitCache->removeSplit($splitName);
             }
         }
     }
     if (isset($splitChanges['till'])) {
         $till = $splitChanges['till'];
         $this->logger()->debug("Splits Till value: {$till}");
         //Updating next since (till) value.
         if ($till != $splitCache->getChangeNumber()) {
             $splitCache->setChangeNumber($till);
         }
     }
 }