Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ db.insert_shop({'name': 'Crepe食堂', 'tel': '01234567890'})
- Site (出典サイト情報)
- Page (各サイト毎の店舗情報)
- Review (レビュー情報)
- ReviewScore (レビューごとのスコア)
- ShopScore (店舗ごとのスコア)


### Shop
Expand Down Expand Up @@ -79,5 +81,24 @@ db.insert_shop({'name': 'Crepe食堂', 'tel': '01234567890'})
| PageID | page_id | Integer | - | x | `3` |
| Pageデータ(Selectのみ) | page | Page | - | x | |

### ReviewScore
| | カラム名 | 型 | Unique | Nullable | 例 |
| ------------------------ | --------- | ----------- | ------ | -------- | ------------- |
| ReviewScoreID | id | Integer | o | x | `1`(自動付与) |
| Reviewデータ(Selectのみ) | review | Review | - | o | |
| ReviewID | review_id | Integer | - | o | `1` |
| 評価項目 | category | String(128) | - | o | `価格` |
| スコア | score | Float | - | x | `2.1` |

### ShopScore
| | カラム名 | 型 | Unique | Nullable | 例 |
| ---------------------- | -------- | ----------- | ------ | -------- | ------------- |
| ShopScoreID | id | Integer | o | x | `1`(自動付与) |
| Shopデータ(Selectのみ) | shop | Shop | - | x | |
| ShopID | shop_id | Integer | - | x | `1` |
| 評価項目 | category | String(128) | - | o | `価格` |
| スコア | score | Float | - | x | `2.1` |




12 changes: 12 additions & 0 deletions src/crepedb/crepedb.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,18 @@ def insert_reviews_am(self, reviews):
res.append(self.insert_review_am(review))
return res

def insert_review_score(self, review):
# 仕様が確定したら実装する
raise NotImplementedError

def insert_review_scores(self, reviews):
# 仕様が確定したら実装する
raise NotImplementedError

def aggregate_score(self):
# ReviewScoreをShopScoreに集計する 仕様が確定したら実装する
raise NotImplementedError

def select_shop(self, limit=None, pagenum=1, order_by=Shop.id, descend=False):
return select.select_shop(self.session, limit, pagenum, order_by, descend)

Expand Down
53 changes: 52 additions & 1 deletion src/crepedb/insert.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from sqlalchemy.orm import sessionmaker
from . import models
from .models import Shop, Site, Page, Review
from .models import Shop, Site, Page, Review, ReviewScore, ShopScore
from .util import get_info_from_google_without_phone_number

def getParam(dic, key):
Expand Down Expand Up @@ -129,3 +129,54 @@ def insert_reviews(session, reviews):
session.commit()

return items

def insert_review_score(session, score):
item = ReviewScore()
item.review_id = getParam(score, 'review_id')
item.category = getParam(score, 'category')
item.score = getParam(score, 'score')

session.add(item)
session.commit()

return item

def insert_review_scores(session, scores):
items = []
for score in scores:
item = ReviewScore()
item.review_id = getParam(score, 'review_id')
item.category = getParam(score, 'category')
item.score = getParam(score, 'score')
items.append(item)

session.add_all(items)
session.commit()

return items

def insert_shop_score(session, score):
item = ShopScore()
item.shop_id = getParam(score, 'shop_id')
item.category = getParam(score, 'category')
item.score = getParam(score, 'score')

session.add(item)
session.commit()

return item

def insert_shop_scores(session, scores):
items = []
for score in scores:
item = ShopScore()
item.shop_id = getParam(score, 'shop_id')
item.category = getParam(score, 'category')
item.score = getParam(score, 'score')
items.append(item)

session.add_all(items)
session.commit()

return items

19 changes: 18 additions & 1 deletion src/crepedb/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy import Column, Integer, String, ForeignKey, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Expand Down Expand Up @@ -43,3 +43,20 @@ class Review(Base):
original_id = Column(Integer)
page = relationship('Page')
page_id = Column(Integer, ForeignKey('pages.id'))

class ReviewScore(Base):
__tablename__ = 'reviewscores'
id = Column(Integer, primary_key=True)
review = relationship('Review')
review_id = Column(Integer, ForeignKey('reviews.id'))
category = Column(Integer)
score = Column(Float)

class ShopScore(Base):
__tablename__ = 'shopscores'
id = Column(Integer, primary_key=True)
shop = relationship('Shop')
shop_id = Column(Integer, ForeignKey('shops.id'))
category = Column(Integer)
score = Column(Float)

100 changes: 99 additions & 1 deletion src/crepedb/select.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sqlalchemy
from sqlalchemy import asc, desc
from sqlalchemy.orm import sessionmaker
from .models import Shop, Site, Page, Review
from .models import Shop, Site, Page, Review, ReviewScore, ShopScore


def select_shop(session,
Expand Down Expand Up @@ -57,3 +57,101 @@ def select_page_from_original_id(session, original_id):
return session.query(Page) \
.filter(Page.original_id == original_id) \
.scalar()

def select_review_score(session,
limit=None,
pagenum=1,
order_by=ReviewScore.id,
descend=False):
order = desc if descend else asc
query = session.query(ReviewScore)
if order_by is ReviewScore.id:
query = query.order_by(order(order_by))
else:
query = query.order_by(order(order_by), ReviewScore.id.asc())
if limit is None:
return query.all()
else:
return query.offset(limit * pagenum) \
.limit(limit) \
.all()


def select_review_score_lazy(session, limit=None, order_by=ReviewScore.id, descend=False):
reviews = None
offset = 0
order = desc if descend else asc

while True:
query = session.query(ReviewScore)
if order_by is ReviewScore.id:
query = query.order_by(order(order_by))
else:
query = query.order_by(order(order_by), ReviewScore.id.asc())

reviews = query.offset(offset).limit(limit).all()

if not reviews:
break

offset += len(reviews)
yield reviews

def select_review_score_from_shop_id(session, shop_id,
limit=None, pagenum=1, order_by=ReviewScore.id, descend=False):
order = desc if descend else asc
query = session.query(ReviewScore)\
.join(Review, Review.id == ReviewScore.review_id)\
.join(Page, Page.id == Review.page_id)\
.join(Shop, Shop.id == Page.shop_id)\
.filter(Shop.id == shop_id)
if order_by is ReviewScore.id:
query = query.order_by(order(order_by))
else:
query = query.order_by(order(order_by), ReviewScore.id.asc())
if limit is None:
return query.all()
else:
return query.limit(limit)\
.offset(limit * pagenum)\
.all()


def select_shop_score(session,
limit=None,
pagenum=1,
order_by=ShopScore.id,
descend=False):
order = desc if descend else asc
query = session.query(ShopScore)
if order_by is ShopScore.id:
query = query.order_by(order(order_by))
else:
query = query.order_by(order(order_by), ShopScore.id.asc())
if limit is None:
return query.all()
else:
return query.offset(limit * pagenum) \
.limit(limit) \
.all()


def select_shop_score_lazy(session, limit=None, order_by=ShopScore.id, descend=False):
shops = None
offset = 0
order = desc if descend else asc

while True:
query = session.query(ShopScore)
if order_by is ShopScore.id:
query = query.order_by(order(order_by))
else:
query = query.order_by(order(order_by), ShopScore.id.asc())

shops = query.offset(offset).limit(limit).all()

if not shops:
break

offset += len(shops)
yield shops
2 changes: 1 addition & 1 deletion tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ def setUp(self):
self.db = CrepeDB('sqlite:///:memory:')

def test_tableList(self):
self.assertEqual(set(['pages', 'reviews', 'shops', 'sites']),
self.assertEqual(set(['pages', 'reviews', 'shops', 'sites', 'reviewscores', 'shopscores']),
set(self.db.engine.table_names()))