from pymongo import MongoClient
import pprint,sys,re


client = MongoClient()
db = client.lobbyradar
entity_cursor = db.entities.find()


# remove unicode prefix, taken from:
# http://stackoverflow.com/questions/16888409/suppress-unicode-prefix-on-strings-when-using-pprint
class writer :
    def write(self, text):
        text=re.sub(r'u\'([^\']*)\'', r'\1',text)
        sys.stdout.write(text)

wrt=writer()
p = pprint.PrettyPrinter(stream=wrt)

"""
Explanation: Lobbyradar - Expolratory Data Analysis
End of explanation
"""


 p.pprint(db.entities.distinct("type"))

from bson.son import SON
pipeline = [ {"$group": {"_id": "$type", "counter": {"$sum": 1}}}]
 
p.pprint(list(db.entities.aggregate(pipeline, cursor={})))

"""
Explanation: The Entities document contains approx. 20k persons and 6.5k non-persons, which are refered to as "entities":
End of explanation
"""


p.pprint(db.relations.distinct('type'))

"""
Explanation: Durch Anzeige aller Relationentypen werden folgende Eigenschaften der bereitgestellten Informationen deutlich:
1. Die Sprache der erfassten Daten ist nicht konsistent, z.B.: bei "subsidiary" und "Tochterfirma", wobei beide Begriffe die gleiche bedeuting haben.
2. Manche Daten sind mit Schrieb- bzw. Typfehler erfasst, z.b.: "ececutive" und "subisdiary".
3. In manchen Fällen ist es nicht vollkommen klar, was unter die Beziehungstyp zu verstehen ist und es Bedarf weitere Recherche, z.B.: bei "publication" und "government".
End of explanation
"""


types = list(db.relations.aggregate(pipeline, cursor={}))
for typ in types:
    if typ["counter"] < 5:
        p.pprint(typ)

"""
Explanation: Möchte man mit diesen Typ-Kategorien arbeiten, sollte man Ausreißer eliminieren oder mit andern Kategorien vereinigen:
End of explanation
"""


print "All relations tags:"
p.pprint(db.relations.distinct("tags"))

 print "All entity tags:"
p.pprint(db.entities.distinct("tags"))

query = {'type':'entity', 'importer': {'$in':['parteispenden','parteispenden13', 'parteispenden14']}}
projection = {'_id':0, 'name':1} 
for i in db.entities.find(query, projection):
    p.pprint(i)

pipeline = [ {"$group": {"_id": "$tags", "count": {"$sum": 1}}} , {"$sort": {"count":-1} }]
p.pprint(list(db.relations.aggregate(pipeline, cursor={})))

"""
Explanation: Sowohl Entitäte, als auch Relationen verfügen über beschreibungs-"tags":
End of explanation
"""


print db.entities.find({"tags" :{"$in": [ "lobbyismus", "lobbyist", "lobbyorganisation"]}}).count()

"""
Explanation: Während die Relationen nur eine Beziehung des Typs "lobbyist" haben, kann mann viele Personen und Organisationen in der entities Collection finden, die als Lobbyisten bezeichnet werden:
End of explanation
"""


print db.entities.find({"tags" :{"$in": [ "parteispenden", "parteispenden13", "parteispenden14"]}}).count()

def display(query, projection):
    data = db.entities.find(query, projection)
    data = data.sort("name") 
    for i in data:
        p.pprint(i)

def entities_find(key, value):
    query = {key: value}
    projection = {"_id":0, "name":1}
    display(query, projection)
   
    

entities_find("tags", "IT")

"""
Explanation: Ebenso sind zahlreiche Beispiele für Spender zu finden, allerdings nicht im Bezug auf einer Organisation, sondern als gernelle Bezeichnung:
End of explanation
"""


query = {"type": "person", "tags": "linke"}
projection = {"_id":0, "name":1}
display(query, projection)


query = {"name":"Angela Merkel"}
projection = {"_id":0, "tags":1}
display(query, projection)


tmp = db.entities.find_one({"name":"Angela Merkel"})
p.pprint(tmp)

# vornamen: merkel, nachnamen: angela ..hemm

"""
Explanation: Merkwürdigerweise findet man Bundeskanzlerin Merkel nicht, wenn man nach den cdu-tag sucht:
End of explanation
"""


db.entities.find({"tags": []}).count()

"""
Explanation: Möchte man die tags als Indikator benutzen, stellt sich die Frage, ob alle Entitäten tags haben:
End of explanation
"""


db.entities.find_one({"name": "NPD"})

db.entities.find_one({"name": "Fraktion Die Linke"})


db.entities.find_one({"name": "SPD-Bundestagsfraktion"})


"""
Explanation: Bei Parteien stellt sich die Frage, wie es zu erkennen ist, dass es sich um eine Partei handelt:
End of explanation
"""


