Hoe waarden van hashkaarten bij te voegen?

ik heb een aantal SQL-tabellen opgehaald via JDBC en ik moet nog een transformatie uitvoeren voordat ik een nieuwe tabel maak en waarden invoeg.

Ik heb deze twee hash-kaarten:

hoofdstukken:

(
{: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}
)

Vertaling:

(
{: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"}
)

Dit moet ik krijgen:

Where Chapters.lx_chapter_text = Translation.translation_text -> swap Chapters.lx_chapter_text with translation_name and insert :language value -> Make sure that every language has its own hash-map!

(
{: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"}
)

Dit is hoe ver ik heb:

maar zoals je kunt zien is dit niet goed (slecht genest)

Kun je me vertellen hoe het moet, toch? Dank je!

(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
Hoe wil je je aansluiten bij waarden? volgens wat? als je {: a 1} en {: a 2} hebt wat is a ?
toegevoegd de auteur Ertuğrul Çetin, de bron
Waarom zou je niet direct mee doen aan de db/sql?
toegevoegd de auteur cfrick, de bron
Het spijt me, ik begrijp uw vraag niet. Er is: l * _chapter_text die kan worden toegewezen aan: translation_text voor elke taal eenmaal ...
toegevoegd de auteur Akiz, de bron
Ik weet niet hoe ik moet schrijven in SQL :-). De Chapter-hash-map is al het resultaat van SQL dat de hiërarchie uitbreidt (originele tabel heeft alleen UUID, HOOFDSTUK, PARENT, TEXT-velden) en ik weet niet hoe ik die SQL moet combineren met degene die je proporteert ...
toegevoegd de auteur Akiz, de bron

5 antwoord

Ten eerste, heeft u een lijst met alle talen die worden gebruikt in vertalingen? Zo niet, laten we het afleiden uit de verzameling vertalingen :

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

Ten tweede, aangezien u de vertalingen -collectie als een opzoektabel gaat gebruiken, is het zinvol om er een kaart van te maken. De eenvoudigste (maar misschien niet de meest efficiënte) manier om dit te doen is om de functie group-by te gebruiken:

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

Looks like what you need to do is to convert each :l

3
toegevoegd

Ten eerste, heeft u een lijst met alle talen die worden gebruikt in vertalingen? Zo niet, laten we het afleiden uit de verzameling vertalingen :

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

Ten tweede, aangezien u de vertalingen -collectie als een opzoektabel gaat gebruiken, is het zinvol om er een kaart van te maken. De eenvoudigste (maar misschien niet de meest efficiënte) manier om dit te doen is om de functie group-by te gebruiken:

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

Looks like what you need to do is to convert each :l

3
toegevoegd
(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)))
0
toegevoegd
(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)))
0
toegevoegd
(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)))
0
toegevoegd