make sure the same word dosn't appear twice * ->make sure the main word does't appear in cloud * ->filter to make all other words nouns, adg, etc. * ->word count for percentage of words possible (if few words, small cloud ; if lots * of words, big cloud * -> */ require_once("db.php"); class NodeTestTool { //private static $typer1r2 = "type in ($r1, $r2)"; //private static $banned_types = "4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001"; private static $relations = array(0 => "r_associated", 5 => "r_syn", 6 => "r_isa", 7 => "r_anto", 8 => "r_hypo", 9 => "r_haspart", 10 => "r_holo", 13 => "r_agent", 15 => "r_lieu", 16 => "r_inst", 17 => "r_carac"); /***********************GENERAL METHODS***********************************/ public static function getWordFromEID($eid) { $db = getDB(); $query = "SELECT name FROM node WHERE eid = $eid"; $result = $db->querySingle($query, true); if($result != null) return $result['name']; else return null; } public static function getEIDFromWord($word) { $db = getDB(); $query = "SELECT eid FROM node WHERE name = '$word'"; $result = $db->querySingle($query, true); if($result != null) return $result['eid']; else return null; } public static function isEIDInDB($eid) { $db = getDB(); $query = "SELECT eid FROM node WHERE eid = $eid"; $result = $db->querySingle($query, true); if ($result != null) return true; return false; } public static function isWordInDB($word) { $db = getDB(); $query = "SELECT eid FROM node WHERE name = '$word'"; $result = $db->querySingle($query, true); if ($result != null) return true; return false; } public static function isCentralEIDinDB($centralEID) { $db = getDB(); $query = "SELECT eid FROM random_center_node WHERE eid = $centralEID"; $result = $db->querySingle($query, true); if ($result != null) return true; return false; } public static function isCentralWordInDB($word) { $centralEID = NodeTestTool::getEIDFromWord($word); return NodeTestTool::isCentralEIDinDB($centralEID); } public static function isCloudEIDInDB($cloudEID) { $db = getDB(); $query = "SELECT eid FROM random_cloud_node WHERE eid = $cloudEID"; $result = $db->querySingle($query, true); if ($result != null) return true; return false; } public static function isCloudWordInDB($cloudWord) { $db = getDB(); $cloudEID = NodeTestTool::getEIDFromWord($cloudWord); return NodeTestTool::isCloudEIDinDB($cloudEID); } public static function getPOSsFromEID($eid) { $db = getDB(); $query = "SELECT end FROM relation WHERE type = 4 AND start = $eid;"; $res = $db->query($query); $adj = $adv = $nom = $ver = false; $s = ""; while ($tuple = $res->fetchArray()) { $endEID = $tuple['end']; $query = "SELECT name FROM node WHERE eid = $endEID"; $res2 = $db->querySingle($query, true); $POSline = $res2['name']; if (preg_match("/^Adj:/", $POSline)) { if ($adj == false) { $s .= "Adj "; $adj = true; } } else if (preg_match("/^Adv:/", $POSline)) { if ($adv == false) { $s .= "Adv "; $adv = true; } } else if (preg_match("/^Nom:/", $POSline)) { if ($nom == false) { $s .= "Nom "; $nom = true; } } else if (preg_match("/^Ver:/", $POSline)) { if ($ver == false) { $s .= "Ver "; $ver = true; } } } return $s; } public static function getPOSsFromWord($word) { $eid = NodeTestTool::getEIDFromWord($word); $POSs = NodeTestTool::getPOSsFromEID($eid); return $POSs; } public static function getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo) { if (NodeTestTool::isCentralEIDinDB($centralEID)) { $db = getDB(); $query = "SELECT end FROM relation WHERE type = $relNo AND start = $centralEID"; $res = $db->query($query); $s = ""; while ($tuple = $res->fetchArray()) { $eid2 = $tuple['end']; $query = "SELECT eid FROM node WHERE eid = $eid2"; $res2 = $db->querySingle($query, true); $s .= $res2['eid'] . ":"; } if(strlen($s) > 0) $s = substr($s, 0, -1); return $s; } return null; } public static function getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo) { if (NodeTestTool::isCentralEIDInDB($centralEID)) { $db = getDB(); $query = "SELECT end FROM relation WHERE type = $relNo AND start = $centralEID"; $res = $db->query($query); $s = ""; while ($tuple = $res->fetchArray()) { $eid2 = $tuple['end']; $query = "SELECT name FROM node WHERE eid = $eid2"; $res2 = $db->querySingle($query, true); $s .= $res2['name'] . ":"; } if(strlen($s) > 0) $s = substr($s, 0, -1); return $s; } return null; } public static function getCloudEIDsFromCentralWordAndRelNo($centralWord, $relNo) { $centralEID = NodeTestTool::getEIDFromWord($centralWord); if (NodeTestTool::isCentralEIDInDB($centralEID)) { return NodeTestTool::getCloudEIDsFromCentralEIDandRelNo($centralEID, $relNo); } return false; } public static function getCloudWordsFromCentralWordAndRelNo($centralWord, $relNo) { if (NodeTestTool::isCentralWordInDB($centralWord)) { $centralEID = NodeTestTool::getEIDFromWord($centralWord); return NodeTestTool::getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo); } return false; } public static function getAllCloudEIDsFromCentralEID($centralEID) { $s = ""; foreach (NodeTestTool::$relations AS $relNo => $relName) { $cloud = NodeTestTool::getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo); $s .= $relNo . "=>" . $relName . ": " . $cloud . "
"; } return $s; } public static function getAllCloudWordsFromCentralEID($centralEID) { $s = ""; foreach (NodeTestTool::$relations AS $relNo => $relName) { $cloud = NodeTestTool::getCloudWordsFromCentralEIDAndRelNo($centralEID, $relNo); $s .= $relNo . "=>" . $relName . ": " . $cloud . "
"; } return $s; } public static function getAllCloudEIDsFromCentralWord($centralWord) { $s = ""; foreach (NodeTestTool::$relations AS $relNo => $relName) { $cloud = NodeTestTool::getCloudEIDsFromCentralWordAndRelNo($centralWord, $relNo); $s .= $relNo . "=>" . $relName . ": " . $cloud . "
"; } return $s; } public static function getAllCloudWordsFromCentralWord($centralWord) { $s = ""; foreach (NodeTestTool::$relations AS $relNo => $relName) { $cloud = NodeTestTool::getCloudWordsFromCentralWordAndRelNo($centralWord, $relNo); $s .= $relNo . "=>" . $relName . ": " . $cloud . "
"; } return $s; } /*****************************RANDOM METHODS**************************/ public static function getRandomCentralEID() { $db = getDB(); $query = "SELECT eid FROM random_center_node WHERE rowid = (ABS(RANDOM()) % (SELECT MAX(rowid) FROM random_center_node)) + 1"; $res = $db->querySingle($query, true); if ($res != null) return $res['eid']; else return null; } public static function getRandomCentralWord() { $eid = NodeTestTool::getRandomCentralEID(); return NodeTestTool::getWordFromEID($eid); } public static function getAbsoluteRandomCloudEID() { $db = getDB(); $query = "SELECT eid FROM random_cloud_node WHERE rowid = (ABS(RANDOM()) % (SELECT MAX(rowid) FROM random_center_node)) + 1"; $res = $db->querySingle($query, true); if ($res != null) return $res['eid']; else return null; } public static function getAbsoluteRandomCloudWord() { $eid = NodeTestTool::getAbsoluteRandomCloudEID(); return NodeTestTool::getWordFromEID($eid); } public static function getRandomCloudEIDFromCentralEID($centralEID, $relNo){ $s = NodeTestTool::getCloudEIDsFromCentralEIDAndRelNo($centralEID, $relNo); $ar = preg_split("/:/", $s); if(count($ar) > 0) return $ar[rand(0, count($ar)-1)]; return null; } public static function getRandomCloudWordFromCentralEID($centralEID, $relNo){ $eid = NodeTestTool::getRandomCloudEIDFromCentralEID($centralEID, $relNo); if($eid != null) return NodeTestTool::getWordFromEID($eid); return null; } public static function getRandomCloudEIDFromCentralWord($centralWord, $relNo){ $centralEID = NodeTestTool::getEIDFromWord($centralWord); if($centralEID != null) return NodeTestTool::getRandomCloudEIDFromCentralEID($centralEID, $relNo); return null; } public static function getRandomCloudWordFromCentralWord($centralWord, $relNo){ $centralEID = NodeTestTool::getEIDFromWord($centralWord); if($centralEID != null) return NodeTestTool::getRandomCloudWordFromCentralEID($centralEID, $relNo); return null; } public static function getWordCloudDistance2($centralWord, $relNoDist1, $relNoDist2){ $randomCloudWord = NodeTestTool::getRandomCloudWordFromCentralWord($centralWord, $relNoDist1); echo "Mot intermédiaire : " . $randomCloudWord . "
"; if(strlen($randomCloudWord) > 0) return NodeTestTool::getCloudWordsFromCentralWordAndRelNo($randomCloudWord, $relNoDist2); return null; } /* * In the implementation of the function getWordCloudDistance2, 8 different * functions could be made corresponding to returning a word cloud or an * eid cloud, the naming would have to be changed to reflect the different * parameters and return values... */ //TODO: FROM HERE DOWN ISN4T IN nodeTest01.php START FROM HERE !! //getRandomCloudFromCentralEID($centralEID, $numWords) //getRandomCloudFromCentralWord($centralWord, $numWords) /* * *******************************WRONG OR DISTORTED CLOUD WORDS********* */ public static function getRandomCloudEIDofCloudEID($couldEID, $relNum) { } public static function getRandomCloudWordOfCloudWord($cloudWord, $relNum) { } /*************************ACCESSEURS************************/ public static function getRelations(){ return NodeTestTool::$relations; } /* * ***********************************GD****************************** */ /** * (gd) Voisins 1 saut du bon type (= relations déjà existantes) * @global $typer1r2 * @param $r1 * @param $r2 * @param $centerEID */ public static function gd1JumpGoodType($r1, $r2, $centerEID) { global $typer1r2; $db = getDB(); $query = "SELECT end AS eid, type = $r1 as r1, type = $r2 as r2, 0 as r0, 0 as trash FROM relation WHERE start = $centerEID AND $typer1r2 order by random()"; $result = $db->querySingle($query, true); //?? return $result['end']; //?? } /** * (gd) Voisins 1 saut via r_associated (0), donc qu'on voudrait spécifier * si possible. * @param $centerEID */ public static function gd1JumpViaRAssociated0($centerEID) { $db = getDB(); $query = "SELECT end AS eid, 0.25 AS r1, 0.25 AS r2, 0.5 AS r0, 0 AS trash FROM relation WHERE start = $centerEid AND type = 0 order by random()"; $result = $db->querySingle($query, true); //?? return $result['end']; //?? } /** * (gd) Voisins 1 saut via les autres relations * @global $banned_types * @param $centerEid * @param $r1 * @param $r2 * @return */ public static function gd1JumpViaOtherRelation($centerEid, $r1, $r2) { global $banned_types; $query = "SELECT end AS eid, 0.1 AS r1, 0.1 AS r2, 0.8 AS r0, 0 AS trash FROM relation WHERE start = $centerEid AND type NOT IN (0, $r1, $r2, $banned_types) ORDER BY random()"; $result = $db->querySingle($query, true); //?? return $result['end']; //?? } /** * (gd) Voisins 2 sauts, avec un mix de R1 et R2 pour les liens. Par ex * [ A -R1-> B -R2-> C ] ou bien [ A -R2-> B -R2-> C ] * Version optimisée de : "SELECT end AS eid FROM relation WHERE $typer1r2 * AND start IN oneHopWithType ORDER BY random();" * @global $typer1r2 * @param $r1 * @param $r2 * @param $centerEid * @return */ public static function gd2JumpWithMixR1R2ForLinks($r1, $r2, $centerEid) { global $typer1r2; $db = getDB(); $query = "SELECT B.end AS eid, ((A.type = $r1) + (B.type = $r1)) / 3. AS r1, ((A.type = $r2) + (B.type = $r2)) / 3. AS r2, 1/6. AS r0, 1/6. AS trash FROM relation AS A, relation AS B WHERE A.start = $centerEid AND A.$typer1r2 AND B.start = A.end AND B.$typer1r2 ORDER BY random()"; $result = $db->querySingle($query, true); //?? return $result['end']; //?? } /** * (gd) Voisins 1 saut r1/r2 + 1 saut synonyme * Version optimisée de : "SELECT end AS eid FROM relation WHERE start IN * oneHopWithType AND type = 5 order by random()"; * @global $typer1r2 * @param $r1 * @param $r2 * @param $centerEid * @return */ public static function gd1JumpR1DivR2Plus1JumpSynonymOneHopWithType($r1, $r2, $centerEid) { global $typer1r2; $db = getDB(); $query = "SELECT B.end AS eid, (A.type = $r1) * 0.75 as r1, (A.type = $r2) * 0.75 AS r2, 0.25 AS r0, 0 AS trash FROM relation AS A, relation AS B WHERE A.start = $centerEid AND A.$typer1r2 AND B.start = A.end AND B.type = 5 ORDER BY random()"; //$result = $db->querySingle($query, true); //?? //return $result['end']; //?? } /** * Version optimisée de : "SELECT end AS eid FROM relation WHERE start IN * (SELECT end FROM relation WHERE start = $centerEid AND type = 5) AND $typer1r2 * ORDER BY random();" * @global $typer1r2 * @param $r1 * @param $r2 * @param $centerEid * @return */ public static function gd1JumpR1DivR2Plus1JumpSynonym($r1, $r2, $centerEid) { global $typer1r2; $db = getDB(); $query = "SELECT B.end AS eid, (B.type = $r1) * 0.75 as r1, (B.type = $r2) * 0.75 AS r2, 0.25 AS r0, 0 AS trash FROM relation AS A, relation AS B WHERE A.start = $centerEid AND A.type = 5 AND B.start = A.end AND B.$typer1r2 ORDER BY random()"; //$result = $db->querySingle($query, true); //?? //return $result['end']; //?? } /** * // Voisins 2 sauts (tous) * Version optimisée de : "SELECT end AS eid, 0.1 AS r1, 0.1 AS r2, 0.3 AS r0, * 0.5 AS trash FROM relation WHERE start IN (SELECT end FROM relation * WHERE start = $centerEid AND type NOT IN ($banned_types)) AND type NOT IN * ($banned_types) ORDER BY random();" * @global $banned_types $banned_types * @param $centerEid * @param $cloudSize * @return */ public static function gd2JumpAll($centerEid, $cloudSize) { global $banned_types; $db = getDB(); $query = "SELECT x AS eid, 0.1 AS r1, 0.1 AS r2, 0.3 AS r0, 0.5 AS trash FROM (SELECT x FROM (SELECT X.eid + Y.dumb AS x FROM (SELECT B.end AS eid FROM relation AS A, relation AS B WHERE A.type NOT IN ($banned_types) AND A.start = $centerEid AND B.type NOT IN ($banned_types) AND B.start = A.end LIMIT " . ($cloudSize * 4) . ") AS X, (SELECT 0 AS dumb) AS Y)) ORDER BY random()"; //$result = $db->querySingle($query, true); //?? //return $result['end']; //?? } /** * (gd) Centre pointe vers X, M pointe vers X aussi, on prend M. * Version optimisée de : "select start as eid from relation where end in (select end from relation where start = $centerEid) and type not in ($banned_types) order by random();" * Ce n'est toujours pas ça… : "select eid from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit 1) order by random();" * Tordu, mais ça marche \o/ . En fait il faut empêcher l'optimiseur de ramener le random avant le limit (et l'optimiseur est malin… :) * @global $banned_types * @param $cloudSize */ public static function gdXPointsToMMPointsToXTakeM($cloudSize) { global $banned_types; $db = getDB(); $query = "SELECT x as eid, 0.1 as r1, 0.1 as r2, 0.2 as r0, 0.6 as trash FROM (SELECT x from (SELECT X.eid + Y.dumb AS x FROM (SELECT B.start AS eid FROM relation AS A, relation AS B WHERE A.type NOT IN ($banned_types) AND A.start = $centerEid AND B.type NOT IN ($banned_types) AND B.end = A.end limit " . ($cloudSize * 4) . ") AS X, (SELECT 0 AS dumb) AS Y)) ORDER BY random()"; //$result = $db->querySingle($query, true); //?? //return $result['end']; //?? } public static function gdGetGidFromGame() { return "select gid from game where gid = (abs(random()) % (select max(gid) from game))+1 or gid = (select max(gid) from game where gid > 0) order by gid limit 1;"; } // TODO Yoann : faire des tests d'erreur pour ces select ? public static function sqlGetGamesForId($gameId) { return "select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = " . $gameId . ";"; } public static function sqlGetWordEidAndName($gameId) { return "select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = " . $gameId . ";"; } public static function sqlGetInformationAboutGame($gameId) { return "select eid_word,(select name from node where eid=eid_word) as name_word, num, difficulty, totalWeight, probaR1, probaR2, probaR0, probaTrash from game_cloud where gid = " . $gameId . ";"; } public static function sqlGameIsOK($pgid, $gid, $user) { return "SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;"; } public static function sqlGetScoreForUser($user) { return "SELECT score FROM user WHERE login='" . $user . "';"; } public static function sqlGetPlayedGameTime($pgid, $gid, $user) { return "SELECT timestamp FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user';"; } public static function sqlGetNumAndScoreFromGame($pgid, $gid) { return "SELECT num,score from played_game_cloud where pgid = $pgid and gid = $gid;"; } } ?>