データ工学の融合


を、そのタイトルを想像し、複雑な音.私は実際に何をしましたか?まず最初に、なぜ私が最初に何かをしたのかを説明するべきです.

背景


使用しているuhabits 何年も.新しいことに気づいたnumeric habit type が追加されました.v2.0.0 . 以前は、唯一のブール値で習慣を追跡することができます.今一日あたりのチェックボックスの代わりに、あなたは何かをした一日何回を追跡するために数値入力をした.
私は新しい形式から恩恵を受ける古いブール形式で習慣がたくさんありました.例えば、週単位の数ではなく、週単位でコーヒーとアルコールの消費量を追跡していました.私はあたりを見回しましたが、習慣タイプの間で変換する方法を見つけることができませんでした.見つけたthis feature request , しかし、まだ答えはありません.私はCodeBaseを素早く見ていました、そして、私が主な言語(Kotlin)を知らなかった時から、それがPRを作る多くの仕事であると理解しました.だから私は試してみて、習慣型の間で変換する独自の小さなユーティリティを作ることを決めた.
私は知っているUCuintをインポート/内部のSQLiteデータベースのエクスポートをサポートしています.私はKotlinを知りません、しかし、私は現在SQLをします、それで、ソースコードから論理を見つけようとする代わりに、私は新しい数値タイプでいくつかの習慣をつくりました、そして、すべてを輸出しました.私はエクスポートされたDBを開き、古い習慣と新しい習慣の違いを比較しました.

DataModelのリバースエンジニアリング


テーブルやフィールドをかなり簡単に見ることができましたが、実際に使用されたものを教えてくれませんでした.私は、習慣と繰り返しテーブルが私が働く必要があったものであるとわかりました、なぜならば、他が空の(イベント)かメタデータテーブル(AndroidCountメタデータ、SQLiteCountシーケンス)であったので.
私は、何が起こるかについて見るためにデータで乱雑になる必要がありました.習慣表から始めました. 気づいたtype ブール値は0、数値習慣は1です.freq_num ブール習慣の変更のみ.数値習慣では常に1です.それはtarget_value Boolean習慣の場合は一般的に0ですが、数値習慣の任意の数になります.freq_den 時間単位を参照してください.例えば、私が1週につき5回の目標でブール習慣をするならば、各々のタイプのために以下を得ます
// boolean, aim to do something 5 days every 7 days
{freq_den: 7, freq_num: 5, target_value: 0, type: 0}

// numeric, aim to do something 5 times every 7 days
{freq_den: 7, freq_num: 1, target_value: 5, type: 1}
次に私はrepetitions 表.私は、ブールの習慣は一般的に2の値を得たときにチェックされたが、数値の習慣は1000 . 1000は1.00を表現するために使用されますので、小数点も追加できます.1.5は1500である.
2つのメインテーブルの習慣型の違いを確認したら、古いBoolean型から新しい数値型へ変換するPython関数を作成できました.
私の習慣を変換して、再インポートした後に、私はBooleanと数字習慣のためのグラフが全く一致しなかったのに気がつきました.私は2つのオプションを追加することを決めた1グラフを保存しようとすると、データを保存する別の方法は、u習慣はそれを生成します.

型間で変換するCLIの作成


私のコンバータが働いたと確信した後、私はそれを呼び出すために少しCLI層を作って、Githubにそれを発表しました.https://github.com/ConorSheehan1/uhabits_converter
最後の結果は次のようになります.
以前
アフター