/** * checks for userID of existing user in sessions, then cookies * if not found, it creates a new user and saves his userID into the Sessions and cookies */ function __construct() { session_start(); if (isset($_SESSION["user"]) and intval($_SESSION["user"]) != 0) { //everything is OK $this->userID = $_SESSION["user"]; $this->sessionID = $_SESSION["session_no"]; } else { if (isset($_COOKIE["user"]) and intval($_COOKIE["user"]) != 0) { //starting new session, session_no++, post updated cookie $cookie_expire = time() + 60 * 60 * 24 * 30 * 24; if (isset($_COOKIE["session_no"])) { $ses_no = $_COOKIE["session_no"]; } else { $ses_no = 0; } $ses_no++; $this->userID = $_COOKIE["user"]; $_SESSION["user"] = $_COOKIE["user"]; $_SESSION["session_no"] = $ses_no; $this->sessionID = $ses_no; setcookie("user", $_COOKIE["user"], $cookie_expire); setcookie("session_no", $ses_no, $cookie_expire); } else { $usertable = Config::$userTableName; //check whether user is a bot or a human $botFreeUser = true; $browser = $_SERVER["HTTP_USER_AGENT"]; $botNames = Config::$botsAndCrawlersNames; foreach ($botNames as $name) { if (stripos($browser, $name) !== false) { $botFreeUser = false; break; } } if ($botFreeUser) { $query = "insert into `" . $usertable . "`\n (`name`)\n values\n (\"Anonym " . Date("Y-m-d h:i:s") . ", browser:" . $_SERVER["HTTP_USER_AGENT"] . "\") "; $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $this->userID = $database->getInsertedId(); //starting new session, create cookie $cookie_expire = time() + 60 * 60 * 24 * 30 * 24; $ses_no = 1; $_SESSION["user"] = $this->userID; $_SESSION["session_no"] = $ses_no; $this->sessionID = $ses_no; setcookie("user", $this->userID, $cookie_expire); setcookie("session_no", $ses_no, $cookie_expire); } //echo "new user create"; } } }
/** * saves event to the database */ function saveEvent() { /** * TODO: kontrola typu udalosti, pripadne akce svazane s typem */ /* check whether we have an approved event*/ if (in_array($this->event->getEventType(), Config::$recognizedAggregatedEvent)) { $database = ComponentDatabase::get_instance(); echo $this->event->getSQL(); $database->executeQuery($this->event->getSQL()); $database->disconnect(); } }
/** * @return next row from the ResponseList */ public function getNextRow() { if (is_array($this->ResponseList)) { if (isset($this->ResponseList[$this->responseListPosition])) { $this->responseListPosition++; return $this->ResponseList[$this->responseListPosition - 1]; } else { return false; } } else { $db = ComponentDatabase::get_instance(); return $db->getNextRow($this->ResponseList); } }
/** * saves event to the database */ function saveEvent() { /** * TODO: kontrola typu udalosti, pripadne akce svazane s typem */ /* check whether we have an approved event*/ if (in_array($this->event->getEventType(), Config::$recognizedAggregatedEvent)) { $database = ComponentDatabase::get_instance(); $implicitTable = Config::$implicitEventStorageTable; $sql_vsm = "select count(distinct objectID) as pocet from {$implicitTable} " . "where userID=" . $this->event->getUserID() . " and eventType=\"pageview\" "; //echo $this->event->getSQL(); $objects = 0; $d = $database->executeQuery($sql_vsm); $obj = $d->getResponseList(); while ($rec = $database->getNextRow($obj)) { $objects = $rec["pocet"]; } //echo $sql_vsm; //echo $this->event->getSQL($objects) ; $database->executeQuery($this->event->getSQL($objects)); } }
/** * returns $noOfObjects of the best objects for users in $usersArray * method just pick randomly demanded number of the objects from the allowed ones * @param <type> $usersArray array of (userID => similarity) of the selected users * @param <type> $noOfObjects number of objects, we search for * @param <type> $objectList list of allowed objects * @return <type> array( objectID => similarity: 1 ) ) */ public function getBestObjectForUsers($usersArray, $noOfObjects, $objectList = "") { $table = Config::$objectTableName; $objectIDName = Config::$objectIDColumnName; if (is_array($objectList) and sizeof($objectList) != 0) { $objectQuery = " `" . $objectIDName . "` in ("; $first = 1; foreach ($objectList as $obj) { if ($first) { $first = 0; $objectQuery .= "" . $obj . ""; } else { $objectQuery .= ", " . $obj . ""; } } $objectQuery .= ")"; } else { $objectQuery = " 1 "; } $query = "select distinct `" . $objectIDName . "` from `" . $table . "` where " . $objectQuery . " order by RAND() limit " . $noOfObjects . " "; //echo $query; $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $objectsList = $qr->getResponseList(); //packing answer into the array if (!$objectsList) { //wrong query $errLog = ErrorLog::get_instance(); $errLog->logError("Wrong SQL query, no prediction made", "Dummy"); return false; } else { $returnlist = array(); while ($record = $database->getNextRow($objectsList)) { $returnlist[$record[$objectIDName]] = 1; } return $returnlist; } }
/** * method returns count of events specified type * usable for decision which method to use * @param $eventType type of the interaction: "implicit" or "explicit" * @param $eventName optional name of the event (pageview, user_rating etc.) * @return <type> num. of events */ public static function getEventsCount($eventType, $eventName = "") { if ($eventType == "implicit") { $table = Config::$implicitEventStorageTable; } else { if ($eventType == "explicit") { $table = Config::$explicitEventStorageTable; } else { return false; } } if ($eventName != "") { $ev = "`eventType`=\"" . $eventName . "\""; } else { $ev = ""; } $query = "select count(`objectID`) as `num` from `" . $table . "`\n where " . $ev . " "; $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $objectsList = $qr->getResponseList(); $record = $database->getNextRow($objectsList); $res = $record["num"]; return $res; }
private function associateToArray($mysqlResponse) { //not necesarry to save all this data (possible second query) and in first get only the objectID $database = ComponentDatabase::get_instance(); $objectID = Config::$objectIDColumnName; $this->queryResponseArray = array(); while ($record = $database->getNextRow($mysqlResponse)) { $this->queryResponseArray[$record[$objectID]] = $record; if ($record["relevance"] != "") { $this->queryObjectRelevance[$record[$objectID]] = $record["relevance"]; } else { $this->queryObjectRelevance[$record[$objectID]] = 1; } } $database->freeResult($mysqlResponse); }
protected function usersToObjectRate($dbQuery) { $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($dbQuery); $eventsList = $qr->getResponseList(); //rating objects if (!$eventsList) { //wrong query $errLog = ErrorLog::get_instance(); $errLog->logError("No events of the specified type found, no prediction made", "Standard"); return false; } else { while ($record = $database->getNextRow($eventsList)) { if (array_key_exists($record["objectID"], $this->objectToScoreArray)) { $objectRating = $this->objectToScoreArray[$record["objectID"]]; } else { $objectRating = 0; } if (is_array($this->users) and array_key_exists($record["userID"], $this->users)) { $userImportance = $this->users[$record["userID"]]; } else { $userImportance = 0; } $objectRating = $this->ratingAggregation($objectRating, $record["eventValue"], $record["eventType"], $this->eventImportance, $userImportance); $this->objectToScoreArray[$record["objectID"]] = $objectRating; } } }
/** * Sends query to the database, returns its response * @return queryResponse class */ function executeQuery() { $database = ComponentDatabase::get_instance(); return $database->executeQuery($this->query->getSQL()); }
/** *Returns set of users, that this heuristic approved to be used in similarity measuring */ private function getUserHeuristics($userID, $table, $eventNames, $objects) { $query = "select `userID`, count(DISTINCT `objectID`) as `count`\n from `" . $table . "`\n where `userID`!=" . $userID . " and " . $eventQueryImplicit . " " . $objects . "\n group by `userID` having `count`>=2"; //echo $query; $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $eventsList = $qr->getResponseList(); if (!$eventsList) { //wrong query $errLog = ErrorLog::get_instance(); $errLog->logError("No user passed the heuristics, keeping the full no. Of Users", "Standard"); return " "; } else { $result = "and `userID` in ("; $first = 1; while ($record = $database->getNextRow($eventsList)) { if ($first) { $first = 0; $result .= $record["userID"]; } else { $result .= "," . $record["userID"]; } } $result .= " )"; return $result; } }
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ require_once "../public/ComponentCore.php"; //loadCore every time when computing meta preferences (PreferenceComputation) ComponentCore::loadCoreEvents(); //name of the target table //database connection needs to be established $tableName = "implicit_events"; if ($_POST["visitID"] > 0) { $visit_name = "`visitID`,"; $visit_val = "" . $_POST["visitID"] . ","; } else { $visit_name = ""; $visit_val = ""; } //create SQL code $sql = "\ninsert into `" . $tableName . "`\n (" . $visit_name . " `userID`,`objectID`,`sessionID`,`pageID`,`pageType`,`imagesCount`,\n `textSizeCount`,`linksCount`,`windowSizeX`,`windowSizeY`,`pageSizeX`,`pageSizeY`,`objectsListed`,\n `startDatetime`,`endDatetime`,`timeOnPage`,`mouseClicksCount`,`pageViewsCount`,`mouseMovingTime`,\n `mouseMovingDistance`,`scrollingCount`,`scrollingTime`,`scrollingDistance`,\n `printPageCount`,`selectCount`,`selectedText`,`copyCount`,`copyText`,`clickOnPurchaseCount`,\n `purchaseCount`,`forwardingToLinkCount`,`forwardedToLink`,`logFile`) \n VALUES ( " . $visit_val . " " . $_POST["userID"] . ", " . $_POST["objectID"] . "," . $_POST["sessionID"] . ",\"" . $_POST["pageID"] . "\", \"" . $_POST["pageType"] . "\"," . $_POST["imagesCount"] . ",\n " . $_POST["textSizeCount"] . "," . $_POST["linksCount"] . ", " . $_POST["windowSizeX"] . ", " . $_POST["windowSizeY"] . ", " . $_POST["pageSizeX"] . ", " . $_POST["pageSizeY"] . ", \"" . $_POST["objectsListed"] . "\",\n \"" . $_POST["startDatetime"] . "\", \"" . $_POST["endDatetime"] . "\", " . $_POST["timeOnPageMiliseconds"] . ", " . $_POST["mouseClicksCount"] . ", " . $_POST["pageViewsCount"] . "," . $_POST["mouseMovingTime"] . ",\n " . $_POST["mouseMovingDistance"] . "," . $_POST["scrollingCount"] . ", " . $_POST["scrollingTime"] . ", " . $_POST["scrollingDistance"] . ",\n " . $_POST["printPageCount"] . "," . $_POST["selectCount"] . ", \"" . $_POST["selectedText"] . "\", " . $_POST["copyCount"] . ", \"" . $_POST["copyText"] . "\", " . $_POST["clickOnPurchaseCount"] . ", \n " . $_POST["purchaseCount"] . ", " . $_POST["forwardingToLinkCount"] . ",\"" . $_POST["forwardedToLink"] . "\",\"" . $_POST["logFile"] . "\" \n )\nON DUPLICATE KEY\nUPDATE `endDatetime`= \"" . $_POST["endDatetime"] . "\",\n `timeOnPage`= `timeOnPage` + VALUES(`timeOnPage`),\n `mouseClicksCount`= `mouseClicksCount` + VALUES(`mouseClicksCount`),\n `pageViewsCount`= `pageViewsCount` + VALUES(`pageViewsCount`),\n `mouseMovingTime`= `mouseMovingTime` + VALUES(`mouseMovingTime`),\n `mouseMovingDistance`= `mouseMovingDistance` + VALUES(`mouseMovingDistance`),\n `scrollingCount`= `scrollingCount` + VALUES(`scrollingCount`),\n `scrollingTime`= `scrollingTime` + VALUES(`scrollingTime`),\n `scrollingDistance`= `scrollingDistance` + VALUES(`scrollingDistance`),\n `printPageCount`= `printPageCount` + VALUES(`printPageCount`),\n `selectCount`= `selectCount` + VALUES(`selectCount`),\n `selectedText`= concat(`selectedText` , VALUES(`selectedText`)),\n `searchedText`= concat(`searchedText` , VALUES(`searchedText`)),\n `copyCount`= `copyCount` + VALUES(`copyCount`),\n `copyText`= concat(`copyText` , VALUES(`copyText`)),\n `clickOnPurchaseCount`= `clickOnPurchaseCount` + VALUES(`clickOnPurchaseCount`),\n `purchaseCount`= `purchaseCount` + VALUES(`purchaseCount`),\n `forwardingToLinkCount`= `forwardingToLinkCount` + VALUES(`forwardingToLinkCount`),\n `forwardedToLink`= concat( `forwardedToLink` , VALUES(`forwardedToLink`) ),\n `logFile`= concat(`logFile`, VALUES(`logFile`) )\n"; //echo $sql; $database = ComponentDatabase::get_instance(); $database->executeQuery("SET character_set_client=UTF8"); $database->executeQuery($sql); //print_r($_POST); //echo $sql; //echo mysql_error(); if (!$_POST["visitID"] > 0) { echo mysql_insert_id(); } else { echo $_POST["visitID"]; }
/** * method removes $decayCoeficient portion of the events listed in $eventNames with the lowest id * in $eventsTable table from the database - deletes them permanently * @param <type> $eventsTable storing table name * @param <type> $eventNames array of events name * @param <type> $decayCoeficient [0,1] interval - portion of data to be deleted * @return <type> false on error, true otherwise */ public static function removeEvents($eventsTable, $eventNames, $decayCoeficient = 0.1) { $correct = true; if ($decayCoeficient <= 0 or $decayCoeficient > 1) { $correct = false; } if ($eventsTable == "implicitEvents") { $allowedEvents = Config::$recognizedImplicitEvent; $table = Config::$implicitEventStorageTable; } else { if ($eventsTable == "explicitEvents") { $allowedEvents = Config::$recognizedExplicitEvent; $table = Config::$explicitEventStorageTable; } else { if ($eventsTable == "aggregatedEvents") { $allowedEvents = Config::$recognizedAggregatedEvent; $table = Config::$aggregatedEventStorageTable; } else { $correct = false; } } } if (is_array($eventNames) and sizeof($eventNames) != 0) { $evQuery = " `eventType` in ("; $first = 1; foreach ($eventNames as $evName) { if (in_array($evName, $allowedEvents)) { if ($first) { $first = 0; $evQuery .= "\"" . $evName . "\""; } else { $evQuery .= ", " . "\"" . $evName . "\""; } } else { $correct = false; } } $evQuery .= ")"; } else { $evQuery = "1"; } if ($correct) { $database = ComponentDatabase::get_instance(); if ($eventsTable == "implicitEvents" or $eventsTable == "explicitEvents") { $query = "select count(`id`) as `count` from " . $table . " where " . $evQuery . " "; $qResponse = $database->executeQuery($query); if ($qResponse->getQueryState()) { $event = $qResponse->getResponseList(); $rowCount = $qResponse->getNextRow($event); $deletedRows = round($rowCount["count"] * $decayCoeficient); if ($deletedRows > 0) { $query = "delete from " . $table . " where " . $evQuery . " order by `id` limit " . $deletedRows . " "; $qResponse = $database->executeQuery($query); return $qResponse->getQueryState(); } else { return true; } } else { return false; } } else { //aggregated events $portion = 1 - $decayCoeficient; $query = "update " . $table . " set `eventValue` = round(`eventValue`* " . $portion . ") where " . $evQuery . " "; $qResponse = $database->executeQuery($query); return $qResponse->getQueryState(); } } else { return false; } }
/** * saves event to the database */ public function computePreferences($no_clusters = 10) { /** * TODO: kontrola typu udalosti, pripadne akce svazane s typem */ /* check whether we have an approved event*/ if (in_array($this->eventType, Config::$recognizedImplicitEvent)) { $implicit_table = Config::$implicitEventStorageTable; $database = ComponentDatabase::get_instance(); $query_clusters = "\n select count(`objectID`) as `count`, `eventValue` from\n `" . $implicit_table . "`\n where `eventType`=\"" . $this->eventType . "\" \n group by `eventValue` \n order by `eventValue`\n "; //echo $query_clusters; $sum_events = 0; $values_count = array(); $qResponse = $database->executeQuery($query_clusters); if ($qResponse->getQueryState()) { $dbResponse = $qResponse->getResponseList(); while ($qRow = $database->getNextRow($dbResponse)) { //pole hodnota -> pocet $values_count[$qRow["eventValue"]] = $qRow["count"]; //celkovy pocet udalosti $sum_events = $sum_events + intval($qRow["count"]); } } //echo $sum_events; $max_no = 10000000; $clusters = array(); //velice primitivni clusterovani bude chtit vylepsit $ideal_cluster_size = $sum_events / $no_clusters; $remaining_items = $sum_events; $remaining_clusters = $no_clusters; $last_key = 0; $item_no = 0; foreach ($values_count as $key => $value) { $division_point = $ideal_cluster_size * 2 / 3; if ($item_no >= $division_point) { $clusters[$key] = $item_no; $remaining_clusters--; $remaining_items = $remaining_items - $item_no; if ($remaining_clusters > 0) { $ideal_cluster_size = $remaining_items / $remaining_clusters; } else { $ideal_cluster_size = $max_no; } $last_key = $key; $item_no = 0; } $item_no = $item_no + $value; } if ($item_no > 0) { $clusters[$max_no] = $item_no; } else { //posledni cluster bude mit maximalni hodnotu, aby do nej spadlo vse $clusters[$max_no] = $clusters[$last_key]; unset($clusters[$last_key]); } //hodnoty se ukladaji pro vypocet rozptylu $value_array = array(); $cluster_orders = array(); $query_orders = "\n select `ie1`.`eventValue` as `value`, `ie2`.`eventValue` as `order` from\n `" . $implicit_table . "` as `ie1` join `" . $implicit_table . "` as `ie2` \n on(`ie1`.`userID` = `ie2`.`userID` and `ie1`.`objectID` = `ie2`.`objectID` and\n `ie1`.`eventType`=\"" . $this->eventType . "\" and `ie2`.`eventType`=\"order\")\n where 1 \n order by `value`\n "; //echo $query_orders; $qResponse = $database->executeQuery($query_orders); if ($qResponse->getQueryState()) { $dbResponse = $qResponse->getResponseList(); while ($qRow = $database->getNextRow($dbResponse)) { //pole hodnota -> pocet $value = $qRow["value"]; $order = $qRow["order"]; $i = 0; foreach ($clusters as $key => $val) { $i++; if ($key > $value) { $value_array[] = $i; //do kolikateho clusteru hodnota patri? $cluster_orders[$key] = $cluster_orders[$key] + $order; break; } } } } //nyni mame 2 pole - jedno s poctem prvku, druhe s poctem objednavek, udelame preferenci $resulting_clusters = array(); foreach ($clusters as $key => $val) { $item_no = $clusters[$key]; $purchase_no = $cluster_orders[$key]; $preference = $purchase_no / $item_no; $resulting_clusters[$key] = $preference; } print_r($clusters); print_r($cluster_orders); print_r($resulting_clusters); //confidence of each data cluster $std_dev = sqrt($this->variance($value_array)); $query_delete = "delete from `" . Config::$meta_pref_table . "` where `eventType`=\"" . $this->eventType . "\""; $database->executeQuery($query_delete); $query_insert = "insert into `" . Config::$meta_pref_table . "` (`border_from`, `border_to`, `preference`, `confidence`, `eventType`, `lastModified`) values "; $i = 0; $last_border = 0; foreach ($resulting_clusters as $key => $val) { if ($i == 0) { $i++; } else { $query_insert .= ", "; } $query_insert .= "(" . $last_border . ", " . $key . ", " . $val . ", " . $std_dev . ", \"" . $this->eventType . "\", \"" . Date("Y-m-d H:i:s") . "\")"; $last_border = $key; } //echo $this->event->getSQL(); // echo $query_insert; $database->executeQuery($query_insert); // $database->disconnect(); } }
private function compute_user_object_rating($object_id, $user_id) { /*todo compute*/ $database = ComponentDatabase::get_instance(); $feedback = array(); $rating = 0; $query_feedback = "select * from `" . Config::$implicitEventStorageTable . "` where `objectID`=" . $object_id . " and `userID`=" . $user_id . " "; //echo $query_feedback; $qResponse = $database->executeQuery($query_feedback); if ($qResponse->getQueryState()) { $dbResponse = $qResponse->getResponseList(); while ($qRow = $database->getNextRow($dbResponse)) { $feedback[$qRow["eventType"]] = $qRow["eventValue"]; //echo $object_id.$qRow["eventType"]." = ".$qRow["eventValue"]." ;;\n"; //prozatim velmi primitivne agregace ratingu $rating = $rating + Config::$eventImportance[$qRow["eventType"]] * intval($qRow["eventValue"]); } } //echo $object_id." --- ".$rating." ---\n"; return $rating; }
/** * return array of features and its relevance for current object * @param type $oid */ private function getObjectFeatures($oid) { $res_array = array(); $query = "SELECT * FROM `vsm_object_model` WHERE `oid`={$oid}"; $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $features = $qr->getResponseList(); while ($record = $database->getNextRow($features)) { $res_array[$record["feature"]] = $record["relevance"]; } return $res_array; }
private function rateObjects($query) { $database = ComponentDatabase::get_instance(); $qr = $database->executeQuery($query); $eventsList = $qr->getResponseList(); //rating objects if (!$eventsList) { //wrong query //$errLog = ErrorLog::get_instance(); //$errLog->logError("No events of the specified type found, no prediction made","Aggregated"); return false; } else { $last_objectID = null; $objectEvents = array(); while ($record = $database->getNextRow($eventsList)) { if ($last_objectID == $record["objectID"]) { $objectEvents[$record["eventType"]] = $record["eventValue"]; } else { if ($last_objectID != null) { $this->rateObject($last_objectID, $objectEvents); } $last_objectID = $record["objectID"]; $objectEvents = array($record["eventType"] => $record["eventValue"]); } } $this->rateObject($last_objectID, $objectEvents); } }
/** * Sends query to the database, returns its queryResponse * @return queryResponse class type */ function executeQuery() { $relevance = ""; $attrArray = $this->query->getAttributeArray(); if (sizeof($attrArray) != 0) { //some attributes to process $relevance = ", ("; foreach ($attrArray as $attribute) { $type = $attribute->getAttributeType(); switch ($type) { case "int": $relevance .= $this->compareInt($attribute); break; case "Date": $relevance .= $this->compareDate($attribute); break; case "bool": $relevance .= $this->compareBool($attribute); break; case "String": $relevance .= $this->compareString($attribute); break; case "StringFulltext": $relevance .= $this->compareStringFulltext($attribute); break; case "StringMultival": $relevance .= $this->compareStringMultival($attribute); break; } } if ($relevance != "") { $relevance .= "0 )/" . $this->total_importance . " as `relevance` "; $this->query->setSelect($this->query->getSelect() . $relevance); $this->query->setOrderBy(" order by `relevance` desc "); } if ($this->query->getWhere() != "") { $addedConditions = " and (1 " . $this->addedConditions . ") "; } else { $addedConditions = " where (1 " . $this->addedConditions . ") "; } $this->query->setWhere($this->query->getWhere() . $this->addedConditions); } $database = ComponentDatabase::get_instance(); //echo $this->query->getSQL(); return $database->executeQuery($this->query->getSQL()); }
/** * returns all ratings for the user * @param <type> $user * @return <type> array of objectID -> rating */ static function getUserRatings($user) { $database = ComponentDatabase::get_instance(); $tableName = Config::$explicitEventStorageTable; $qResponse = $database->executeQuery("select * from `" . $tableName . "` where `userID`=" . $user . " and `eventType`=\"user_rating\" "); $userRatingArray = array(); if ($qResponse->getQueryState()) { $dbResponse = $qResponse->getResponseList(); while ($qRow = $database->getNextRow($dbResponse)) { $userRatingArray[$qRow["objectID"]] = $qRow["eventValue"]; } } return $userRatingArray; }