Module pelda
[hide private]
[frames] | no frames]

Source Code for Module pelda

  1  # -*- coding: utf-8 -*- 
  2   
  3  """ 
  4  DB API felületen különböző műveleteket végez  
  5  a linkgroup adatbázissal  
  6   
  7  """ 
  8   
9 -def clearDb(db):
10 """ 11 Legyalul minden adatot az adatbázisból, hogy 12 tiszta lappal kezdhessünk. 13 14 @type db: db.Connection 15 @param db: Adatbázis kapcsolat 16 17 """ 18 19 # Kérünk kurzort 20 cur = db.cursor() 21 22 # Ez a csatolás (cascade) miatt törli 23 # a kapcsolatokat is 24 cur.execute(""" 25 DELETE FROM people 26 """) 27 28 # Érvényesítjük a változtatásoakt 29 db.commit()
30
31 -def loadFromFile(fn, db):
32 """ 33 Betölti a bemeneti gráf éleit a bemeneti fájlból 34 és behelyezi az adatokat az adatbázisba. 35 A fájl egy-egy sora az él végpontjainak neveit 36 tartalmazza. 37 38 @type fn: string 39 @param fn: A bemeneti fájl neve 40 @type db: db.Connection 41 @param db: Adatbázis kapcsolat 42 43 """ 44 45 # A pontnév-párok listája 46 pairs = map( 47 lambda x: x.split(), 48 filter( 49 lambda l: l, 50 map( 51 lambda l: l.strip(), 52 file(fn).readlines() 53 ) 54 ) 55 ) 56 57 # Először behelyezzük az embereket a db-be. 58 # Ehhez szükségünk van a nevek listájára 59 60 # A halmaz mindenkit csak egyszer fog tartalmazni 61 people = set() 62 for a, b in pairs: 63 people.add(a) 64 people.add(b) 65 66 # Halmazról listára konvertáljuk 67 people = list(people) 68 69 # Kérünk egy kurzort 70 cur = db.cursor() 71 72 cur.executemany(""" 73 INSERT INTO people (name) VALUES (%s) 74 """, 75 people 76 ) 77 78 # Ezután behelyezzük a kapcsolatokat 79 cur.executemany(""" 80 INSERT INTO connections (author_1, author_2) 81 SELECT p1.id, p2.id 82 FROM people p1, people p2 83 WHERE p1.name = %s 84 AND p2.name = %s 85 """, 86 pairs 87 ) 88 89 # Érvényesítjük a változtatásokat 90 db.commit()
91
92 -def calcDegree(db):
93 """ 94 Kiszámolja és frissíti az adatbázisban az egyes 95 emberek kapcsolatainak számát (fokszámát). 96 97 @type db: db.Connection 98 @param db: Adatbázis kapcsolat 99 100 """ 101 102 cur = db.cursor() 103 104 cur.execute(""" 105 UPDATE 106 people p 107 JOIN ( 108 SELECT id, COUNT(*) deg 109 FROM ( 110 SELECT author_1 AS id FROM connections 111 UNION ALL 112 SELECT author_2 AS id FROM connections 113 ) t 114 GROUP BY id 115 ) degTable 116 ON 117 p.id = degTable.id 118 SET 119 p.deg = degTable.deg 120 """) 121 122 # Ne felejtsük érvényesíteni a változtatásokat 123 db.commit()
124 125 # Konstansok L{getDegrees} által visszaadott párok indexeléséhez 126 IDD_ID = 0 127 IDD_DEG = 1 128
129 -def getDegrees(db):
130 """ 131 Visszaadja az embereket és fokszámaikat fokszám szerint csökkenő 132 sorrendben rendezve. 133 134 Feltételezi, hogy a fokszámok már ki vannak számolva 135 (ehhez meg kellet hívni a L{calcDegree} függvényt). 136 137 @type db: db.Connection 138 @param db: Adatbázis kapcsolat 139 140 @rtype: (azonosító, fokszám) lista 141 @return: Az emberek és fokszámaik. 142 143 """ 144 145 cur = db.cursor() 146 147 cur.execute(""" 148 SELECT id, deg FROM people ORDER BY deg DESC 149 """) 150 151 # Commit most nem kell, mivel nem változtattunk, 152 # csak lekérdeztünk 153 154 return cur.fetchall()
155
156 -def deleteUnderDeg(db, minDeg):
157 """ 158 Kitörli az adatbázisból azokat az embereket, akiknek 159 a fokszáma kisebb, mint minDeg. 160 161 Feltételezi, hogy a fokszámok már ki vannak számolva 162 (ehhez meg kellet hívni a L{calcDegree} függvényt). 163 A függvény meghívása után az adatbázisban érvénytelen fokszámok 164 fognak szerepelni, ezért érdemes lehet utána újból 165 meghívni a L{calcDegree} függvényt. 166 167 @type db: db.Connection 168 @param db: Adatbázis kapcsola 169 @type minDeg: number 170 @param minDeg: Túléléshez szükséges minimális fokszám 171 172 """ 173 174 cur = db.cursor() 175 176 cur.execute(""" 177 DELETE FROM people WHERE deg <= %s 178 """, 179 minDeg 180 ) 181 182 # Mehet 183 db.commit()
184