2017-08-14 10 views
0

私はJDBC経由でいくつかのSQLテーブルをフェッチしました。私は新しいテーブルを作成して値を挿入する前に別の変換を行う必要があります。ハッシュマップから値を結合する方法は?

章:

(
{:chapter_uuid "b7984dde-50a1-4147-bfee-95bbd068e031", :l1_chapter_text 
120876M, :l2_chapter_text nil, :l3_chapter_text nil, :l4_chapter_text nil} 

{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 
120880M, :l2_chapter_text 120876M, :l3_chapter_text nil, :l4_chapter_text 
121621M} 
) 

が翻訳:

(
{:translation_id 3258779M, :translation_text 120876M, :translation_language "cs", 
:translation_name "Vnější fasáda"} 

{:translation_id 3258780M, :translation_text 120876M, :translation_language "en", 
:translation_name "Exterior Signage"} 

{:translation_id 3258782M, :translation_text 120880M, :translation_language "cs", 
:translation_name "Čistá výloha"} 

{:translation_id 3258783M, :translation_text 121621M, :translation_language "cs", 
:translation_name "Vnější signalizace"} 

{:translation_id 3258784M, :translation_text 121621M, :translation_language "en", 
:translation_name "Pre-signalization"} 
) 

これは私が取得するために必要なものです:

私は、これら2つのハッシュマップを得ましたChapters.lx_chapter_text = Tran slation.translation_text - > translation_nameでChapters.lx_chapter_textを入れ替え、挿入:言語の値 - >すべての言語に独自のハッシュマップがあることを確認してください!

(
{:chapter_uuid "b7984dde-50a1-4147-bfee-95bbd068e031", :l1_chapter_text 
"Vnější fasáda", :l2_chapter_text nil, :l3_chapter_text nil, :l4_chapter_text nil 
:language "cs"} 

{:chapter_uuid "b7984dde-50a1-4147-bfee-95bbd068e031", :l1_chapter_text 
"Exterior Signage", :l2_chapter_text nil, :l3_chapter_text nil, :l4_chapter_text nil 
:language "en"} 

{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 
"Čistá výloha", :l2_chapter_text "Vnější fasáda", :l3_chapter_text nil, :l4_chapter_text 
"Vnější signalizace" :language "cs"} 

{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 
120880M, :l2_chapter_text "Exterior Signage", :l3_chapter_text nil, :l4_chapter_text 
"Pre-signalization" :language "en"} 
) 

これはi'veが得たどのくらいです:

をいますが、これは(悪いネストされた)右ではありません見ることができるよう

あなたがそれを行う方法を教えてもらえます右?ありがとうございました!

(defn test_table [] 
    (for [language (distinct(map #(:translation_language %) translation))] 
     (for [chapter chapters] 
      (for [text translation] 
      (cond 
      (and (= (:l1_chapter_text chapter) (:translation_text text)) (= (:translation_language text) language)) 
       (assoc chapter :l1_chapter_text (:translation_name text) :language (:translation_language text)) 
      (and (= (:l2_chapter_text chapter) (:translation_text text)) (= (:translation_language text) language)) 
       (assoc chapter :l2_chapter_text (:translation_name text) :language (:translation_language text)) 
      (and (= (:l3_chapter_text chapter) (:translation_text text)) (= (:translation_language text) language)) 
       (assoc chapter :l3_chapter_text (:translation_name text) :language (:translation_language text)) 
      (and (= (:l4_chapter_text chapter) (:translation_text text)) (= (:translation_language text) language)) 
       (assoc chapter :l4_chapter_text (:translation_name text) :language (:translation_language text)))))) 

(test-table) 

-> 
((({:chapter_uuid "b7984dde-50a1-4147-bfee-95bbd068e031", :l1_chapter_text "Vnější fasáda", 
:l2_chapter_text nil, :l3_chapter_text nil, :l4_chapter_text nil, :language "cs"} 
nil nil nil nil) 
({:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 120880M, 
:l2_chapter_text "Vnější fasáda", :l3_chapter_text nil, :l4_chapter_text 121621M, :language "cs"} 
nil 
{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text "Čistá výloha", 
:l2_chapter_text 120876M, :l3_chapter_text nil, :l4_chapter_text 121621M, :language "cs"} 
{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 120880M, 
:l2_chapter_text 120876M, :l3_chapter_text nil, :l4_chapter_text "Vnější signalizace", :language "cs"} 
nil)) 
((nil 
{:chapter_uuid "b7984dde-50a1-4147-bfee-95bbd068e031", :l1_chapter_text "Exterior Signage", 
:l2_chapter_text nil, :l3_chapter_text nil, :l4_chapter_text nil, :language "en"} 
nil nil nil) 
(nil 
{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 120880M, 
:l2_chapter_text "Exterior Signage", :l3_chapter_text nil, :l4_chapter_text 121621M, :language "en"} 
nil nil 
{:chapter_uuid "23df4f27-534b-4cdb-81ed-dbdc8b9b140c", :l1_chapter_text 120880M, 
:l2_chapter_text 120876M, :l3_chapter_text nil, :l4_chapter_text "Pre-signalization", :language "en"}))) 
+0

どのように値を結合しますか?何に応じて?あなたが{:a 1}と{:a 2}を持っていれば、「a」は何になるでしょうか? –

+0

申し訳ありませんが、私はあなたの質問を理解していません。 l * _chapter_textを割り当てることができます:translation_text すべての言語で一度... – Akiz

+2

これはdb/sqlにすぐに参加できませんか? – cfrick

答えて

3

まず、翻訳に使用されるすべての言語のリストがありますか?そうでない場合、のはtranslationsコレクションからそれを派生してみましょう:

(def langs (distinct (map :translation_language translations))) ;; => ("cs" "en") 

第二に、あなたがルックアップテーブルとしてtranslationsコレクションを使用しようとしているとして、それはそれのマップを作ることは理にかなっています。

(def translations-map 
    (group-by (juxt :translation_text :translation_language) translations)) 

はあなたが何をする必要があるかのように見える

は、実際のテキストに各 :l<#>_chapter_textを変換する場合、またはIDを維持することです:道(多分、最も効率的ではないが)最も簡単にはそれが group-by機能を使用することです行うには翻訳は指定された言語では利用できません。私たちが作成したマップを使用して、それはほとんど自明である:

(defn translate [id lang] 
    (or (:translation_name (first (get translations-map [id lang]))) 
     id)) 

それでは、一緒にすべてを入れてみましょう、各chapterを取ると、各言語について、翻訳してすべてのIDを交換しようとしている:

(for [chapter chapters 
     lang langs] 
    (-> chapter 
     (assoc :language lang) 
     (update :l1_chapter_text translate lang) 
     (update :l2_chapter_text translate lang) 
     (update :l3_chapter_text translate lang) 
     (update :l4_chapter_text translate lang))) 

これは、望ましい結果を返すはずです。

0
(let [a ... 
     b ...] 
    (as-> [:l1_chapter_text :l2_chapter_text :l3_chapter_text :l4_chapter_text] 
     relations 
     (interleave relations (repeat :translation_text)) 
     (apply hash-map relations) 
     (mapcat #(clojure.set/join a b (into {} [%])) relations) 
     (group-by (fn [a] (apply str ((juxt :chapter_uuid :l1_chapter_text :l2_chapter_text :l3_chapter_text :l4_chapter_text :translation_language) a))) relations) 
     (vals relations))) 
関連する問題