Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WCM-285: revert IConnector <-> DAVPropertyConverter behaviour #857

Merged
merged 9 commits into from
Sep 25, 2024
Merged

Conversation

stollero
Copy link
Contributor

@stollero stollero commented Sep 24, 2024

Checklist

  • Documentation
  • Changelog
  • Tests
  • Translations

gif

@stollero stollero changed the title Wcm 285 3 Wcm 285: revert IConnector <-> DAVPropertyConverter behaviour Sep 24, 2024
@stollero stollero marked this pull request as ready for review September 24, 2024 09:48

unsorted = collections.defaultdict(dict)
for (k, ns), v in props.items():
if v is DeleteProperty:
continue
if ns == INTERNAL_PROPERTY:
continue
if isinstance(v, datetime):
Copy link
Contributor Author

@stollero stollero Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wir können in unsorted natürlich nur JSON serializable objects schreiben. datetime bspw. funktioniert nicht.

Ich überlege, welche sinnvolle Lösungsmöglichkeiten es gibt (unabhängig von dem Ansatz, den ich hier ausgebaut habe).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich glaube, die Lage ist sogar noch etwas anders: Im unsorted stehen bisher nur Strings drin, weil wir die Werte 1:1 aus dem DAV dorthin migriert haben, und dort waren nur Strings möglich. Und die IDAVPropertyConverter gehen auch davon aus, dass da nur Strings drinstehen. Wir fangen jetzt zwar mit den "MetadataColumns" an, da ausnahmen zuzulassen, aber da geht es ja nur um Felder, die nicht in unsorted stehen.

Der langen Rede kurzer Sinn: Wenn in IResource.properties ein non-String Wert drinsteht, der weder als internal deklariert noch in seine eigene Spalte umgezogen ist, so ist das ein Programmierfehler. Den sollten wir denke ich also definitiv nicht verschlucken (continue) -- ich würde aber sagen, dazu tun wir hier (nach wie vor) einfach gar nichts, sondern das kann dann gern "weiter hinten" als "not json serializable" knallen.

@wosc wosc changed the title Wcm 285: revert IConnector <-> DAVPropertyConverter behaviour WCM-285: revert IConnector <-> DAVPropertyConverter behaviour Sep 24, 2024

unsorted = collections.defaultdict(dict)
for (k, ns), v in props.items():
if v is DeleteProperty:
continue
if ns == INTERNAL_PROPERTY:
continue
if isinstance(v, datetime):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich glaube, die Lage ist sogar noch etwas anders: Im unsorted stehen bisher nur Strings drin, weil wir die Werte 1:1 aus dem DAV dorthin migriert haben, und dort waren nur Strings möglich. Und die IDAVPropertyConverter gehen auch davon aus, dass da nur Strings drinstehen. Wir fangen jetzt zwar mit den "MetadataColumns" an, da ausnahmen zuzulassen, aber da geht es ja nur um Felder, die nicht in unsorted stehen.

Der langen Rede kurzer Sinn: Wenn in IResource.properties ein non-String Wert drinsteht, der weder als internal deklariert noch in seine eigene Spalte umgezogen ist, so ist das ein Programmierfehler. Den sollten wir denke ich also definitiv nicht verschlucken (continue) -- ich würde aber sagen, dazu tun wir hier (nach wie vor) einfach gar nichts, sondern das kann dann gern "weiter hinten" als "not json serializable" knallen.

core/src/zeit/connector/converter.py Show resolved Hide resolved
Copy link
Member

@wosc wosc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Danke für den Rückbau! Für die Channels tut das jetzt leider noch nicht das gewünschte. (Falls Du lieber erstmal nur den Rückbau machen willst, und die richtige Channels-Implementierung dann in einem separaten PR, könnten wir das meinetwegen auch tun.)

)

def test_converts_aggregate_types_on_read(self):
example_channels = {'channel1': [], 'channel2': ['sub1', 'sub2']}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wir wollen die Channels in der DB genau wie in Python als nested Liste speichern ([["channel1", None], ["channel2", "sub1"], ["channel2", "sub2"]]), war mein Kenntnisstand. Einen Usecase für ein dict haben wir aktuell glaub ich noch gar nicht (könnte aber grundsätzlich kommen, z.B. bei Image Variants oder sowas).



@grok.implementer(IConverter)
class DictConverter(grok.Adapter):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Aufgabe dieser Converter ist, mal platt gesagt, vorhandene .meta Files in den zeit.web Testdaten zu parsen, um die Datentypen draus zu machen, die sowieso rauskämen, wenn es SQL wäre. Dh konkret gesprochen brauchen wir hier einen, der für Channels aus "chan1;chan2 sub1;chan2 sub2" dann [['chan1', None], ['chan2', 'sub1'], ['chan2', 'sub2']] macht, und umgekehrt (dafür könnte man vmtl den CollectionTextLineProperty/ChannelProperty Code aufrufen, um die Implementierung nicht duplizieren zu müssen).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die nächste Frage ist dann, wie man den passenden Converter findet, weil es jetzt ja losgeht, dass wir SQL-seitig sagen "jo klar, ist halt json", aber je nach dem konkreten Feld in dem json dann Dict oder Liste oder sonstwas drinsteht. Das heißt aber, dass es nicht mehr ausreicht, den IConverter rein anhand des Column-Typs nachzuschlagen. Insofern würde ich vorschlagen, dass wird den "Haupt-Adapter" (derzeit converter_from_column_type) umbenennen und erweitern, und im ersten Schritt schauen, ob es einen named Adapter für genau diesen namespace/name gibt (darauf könnte man dann document/channels hängen), und erst im zweiten Schritt anhand des Typs schauen.

@wosc wosc merged commit 3c28074 into main Sep 25, 2024
4 checks passed
@wosc wosc deleted the WCM-285-3 branch September 25, 2024 12:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants