Commit d541c35b authored by sim's avatar sim

Add relationships and repr implementation to nodes and ngrams related models

parent c98bf534
...@@ -7,17 +7,32 @@ __all__ = ['Ngram', 'NodeNgram', 'NodeNodeNgram', 'NodeNgramNgram'] ...@@ -7,17 +7,32 @@ __all__ = ['Ngram', 'NodeNgram', 'NodeNodeNgram', 'NodeNgramNgram']
class Ngram(Base): class Ngram(Base):
__tablename__ = 'ngrams' __tablename__ = 'ngrams'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
terms = Column(String(255), unique=True) terms = Column(String(255), unique=True)
n = Column(Integer) n = Column(Integer)
def __str__(self):
return '<{0.terms}>#{0.n}'.format(self)
def __repr__(self):
return '<Ngram(id={0.id}, terms={0.terms!r}, n={0.n})>'.format(self)
class NodeNgram(Base): class NodeNgram(Base):
__tablename__ = 'nodes_ngrams' __tablename__ = 'nodes_ngrams'
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True) ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
weight = Column(Float) weight = Column(Float)
node = relationship(Node)
ngram = relationship(Ngram)
def __repr__(self):
return '<NodeNgram(node_id={0.node_id}, ngram={0.ngram}, weight={0.weight})>'.format(self)
class NodeNodeNgram(Base): class NodeNodeNgram(Base):
""" for instance for TFIDF """ for instance for TFIDF
( (
...@@ -28,6 +43,7 @@ class NodeNodeNgram(Base): ...@@ -28,6 +43,7 @@ class NodeNodeNgram(Base):
) )
""" """
__tablename__ = 'nodes_nodes_ngrams' __tablename__ = 'nodes_nodes_ngrams'
node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True) ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
...@@ -36,6 +52,14 @@ class NodeNodeNgram(Base): ...@@ -36,6 +52,14 @@ class NodeNodeNgram(Base):
# sinon par défaut on aurait un type sql "double_precision" (soit 15 chiffres) # sinon par défaut on aurait un type sql "double_precision" (soit 15 chiffres)
# (cf. www.postgresql.org/docs/9.4/static/datatype-numeric.html#DATATYPE-FLOAT) # (cf. www.postgresql.org/docs/9.4/static/datatype-numeric.html#DATATYPE-FLOAT)
node1 = relationship(Node, foreign_keys=[node1_id])
node2 = relationship(Node, foreign_keys=[node2_id])
ngram = relationship(Ngram)
def __repr__(self):
return '<NodeNodeNgram(node1_id={0.node1_id}, node2_id={0.node2_id}, ngram={0.ngram}, score={0.score})>'.format(self)
class NodeNgramNgram(Base): class NodeNgramNgram(Base):
""" for instance for COOCCURRENCES and GROUPLIST """ for instance for COOCCURRENCES and GROUPLIST
( (
...@@ -46,7 +70,15 @@ class NodeNgramNgram(Base): ...@@ -46,7 +70,15 @@ class NodeNgramNgram(Base):
) )
""" """
__tablename__ = 'nodes_ngrams_ngrams' __tablename__ = 'nodes_ngrams_ngrams'
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram1_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True) ngram1_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
ngram2_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True) ngram2_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
weight = Column(Float(precision=24)) # see comment for NodeNodeNgram.score weight = Column(Float(precision=24)) # see comment for NodeNodeNgram.score
node = relationship(Node)
ngram1 = relationship(Ngram, foreign_keys=[ngram1_id])
ngram2 = relationship(Ngram, foreign_keys=[ngram2_id])
def __repr__(self):
return '<NodeNgramNgram(node_id={0.node_id}, ngram1={0.ngram1}, ngram2={0.ngram2}, weight={0.weight})>'.format(self)
...@@ -19,6 +19,7 @@ class NodeType(TypeDecorator): ...@@ -19,6 +19,7 @@ class NodeType(TypeDecorator):
def process_result_value(self, typeindex, dialect): def process_result_value(self, typeindex, dialect):
return NODETYPES[typeindex] return NODETYPES[typeindex]
class Node(Base): class Node(Base):
"""This model can fit many purposes. """This model can fit many purposes.
It intends to provide a generic model, allowing hierarchical structure It intends to provide a generic model, allowing hierarchical structure
...@@ -26,6 +27,7 @@ class Node(Base): ...@@ -26,6 +27,7 @@ class Node(Base):
The possible types are defined in `gargantext.constants.NODETYPES`. The possible types are defined in `gargantext.constants.NODETYPES`.
""" """
__tablename__ = 'nodes' __tablename__ = 'nodes'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
typename = Column(NodeType, index=True) typename = Column(NodeType, index=True)
# foreign keys # foreign keys
...@@ -37,6 +39,8 @@ class Node(Base): ...@@ -37,6 +39,8 @@ class Node(Base):
# metadata (see https://bashelton.com/2014/03/updating-postgresql-json-fields-via-sqlalchemy/) # metadata (see https://bashelton.com/2014/03/updating-postgresql-json-fields-via-sqlalchemy/)
hyperdata = Column(JSONB, default=dict) hyperdata = Column(JSONB, default=dict)
parent = relationship('Node', remote_side=[id])
def __init__(self, **kwargs): def __init__(self, **kwargs):
"""Node's constructor. """Node's constructor.
Initialize the `hyperdata` as a dictionary if no value was given. Initialize the `hyperdata` as a dictionary if no value was given.
...@@ -55,6 +59,10 @@ class Node(Base): ...@@ -55,6 +59,10 @@ class Node(Base):
""" """
self.hyperdata[key] = value self.hyperdata[key] = value
def __repr__(self):
return '<Node(typename={0.typename}, user_id={0.user_id}, parent_id={0.parent_id}, ' \
'name={0.name!r}, date={0.date})>'.format(self)
@property @property
def ngrams(self): def ngrams(self):
"""Pseudo-attribute allowing to retrieve a node's ngrams. """Pseudo-attribute allowing to retrieve a node's ngrams.
...@@ -187,8 +195,16 @@ class Node(Base): ...@@ -187,8 +195,16 @@ class Node(Base):
)) ))
return self['statuses'][-1] return self['statuses'][-1]
class NodeNode(Base): class NodeNode(Base):
__tablename__ = 'nodes_nodes' __tablename__ = 'nodes_nodes'
node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True) node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
score = Column(Float(precision=24)) score = Column(Float(precision=24))
node1 = relationship(Node, foreign_keys=[node1_id])
node2 = relationship(Node, foreign_keys=[node2_id])
def __repr__(self):
return '<NodeNode(node1_id={0.node1_id}, node2_id={0.node2_id}, score={0.score})>'.format(self)
...@@ -39,7 +39,7 @@ Double = DOUBLE_PRECISION ...@@ -39,7 +39,7 @@ Double = DOUBLE_PRECISION
######################################################################## ########################################################################
# useful for queries # useful for queries
######################################################################## ########################################################################
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased, relationship
from sqlalchemy import func, desc from sqlalchemy import func, desc
######################################################################## ########################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment