Stefan
Stefan

Reputation: 12370

How to unwind/merge arrays from hierarchical document structure?

I have a nested document structure and I am able to filter it with pluck to show the relevant parts:

enter image description here

Is there an elegant way to merge all entries of the last level to a single array?

Expected result (entries are not unique on purpose):

[
'3425b91f-f019-4db3-ad56-c336bf55279b', 
'3d07946e-183d-4992-9acd-676f5122e1b1', 
'3425b91f-f019-4db3-ad56-c336bf55279b', 
'3d07946e-183d-4992-9acd-676f5122e1b1', 
'2cd652a6-4dcd-4920-9592-d4cdc5a034bf', 
'70fe1812-e1de-447b-ac4f-d89fead4756d', 
'2cd652a6-4dcd-4920-9592-d4cdc5a034bf', 
'70fe1812-e1de-447b-ac4f-d89fead4756d'
]

I tried to use

r.table('periods')['regions']['sites']['plants']['product']['process']['technologies'].run()

but it gives the error "Cannot perform bracket on a sequence of sequences".

=> Is there some alternative operator to get a merged sequence instead a "sequence of sequences" for each step?

Something like

r.table('periods').unwind('regions.sites.plants.product.process.technologies')

Here is some python code to create example data:

from rethinkdb import RethinkDB
r = RethinkDB()
r.connect({}).repl()
r.table_create("periods")

def uniqueid():
    return r.uuid().run()


periodid_first = uniqueid()
periodid_second = uniqueid()


companyid_2000 = uniqueid()
companyid_2001 = uniqueid()

technologyid_2000_first = uniqueid()
technologyid_2000_second = uniqueid()

technologyid_2001_first = uniqueid()
technologyid_2001_second = uniqueid()

energy_carrierid_2000_first = uniqueid()
energy_carrierid_2000_second = uniqueid()

energy_carrierid_2001_first = uniqueid()
energy_carrierid_2001_second = uniqueid()

periods = [
    {
        'id': periodid_first,
        'start': 2000,
        'end': 2000,
        # 'sub_periods': [],
        'regions': [
            {
                'id': 'DE',
                # 'sub_regions': [],
                'sites': [
                    {
                        'id': 'first_site_in_germany',
                        'company': companyid_2000,  # => verweist auf periods => companies
                        'plants': [
                            {
                                'id': 'qux',
                                'product': {
                                    'id': 'Ammoniak',
                                    'process': {
                                        'id': 'SMR+HB',
                                        'technologies': [
                                           technologyid_2000_first,  # => verweist auf periods => technologies
                                           technologyid_2000_second
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                ]
            },
            {
                'id': 'FR',
                # 'sub_regions': [],
                'sites': [
                    {
                        'id': 'first_site_in_france',
                        'company': companyid_2000,  # => verweist auf periods => companies
                        'plants': [
                            {
                                'id': 'qux',
                                'product': {
                                    'id': 'Ammoniak',
                                    'process': {
                                        'id': 'SMR+HB',
                                        'technologies': [
                                           technologyid_2000_first,  # => verweist auf periods => technologies
                                           technologyid_2000_second
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        ],
        'companies': [
            {
                'id': companyid_2000,
                'name': 'international_company'
            }
        ],
        'technologies': [
             {
                'id': technologyid_2000_first,
                'name': 'SMR',
                'specific_cost_per_year': 123,
                'specific_energy_consumptions': [
                    {
                        'energy_carrier': energy_carrierid_2000_first,
                        'specific_consumption': 5555
                    },  # => verweist auf periods => energy_carriers
                    {
                         'energy_carrier': energy_carrierid_2000_second,
                         'energy_consumption': 2333
                    }
                ]
             },
             {
                'id': technologyid_2000_second,
                'name': 'HB',
                'specific_cost_per_year': 1234,
                'specific_energy_consumptions': [
                    {
                        'energy_carrier': energy_carrierid_2000_first,
                        'specific_consumption': 555
                    },  # => verweist auf periods => energy_carriers
                    {
                         'energy_carrier': energy_carrierid_2000_second,
                         'energy_consumption': 233
                    }
                ]
             }
        ],
        'energy_carriers': [
            {
                'id': energy_carrierid_2000_first,
                'name': 'oil',
                'group': 'fuel'
            },
            {
                'id': energy_carrierid_2000_second,
                'name': 'gas',
                'group': 'fuel'
            },
            {
                'id': uniqueid(),
                'name': 'conventional',
                'group': 'electricity'
            },
            {
                'id': uniqueid(),
                'name': 'green',
                'group': 'electricity'
            }
        ],
        'networks': [
            {
                'id': uniqueid(),
                'name': 'gas',
                'sub_networks': [],
                'pipelines': [

                ]
            },
            {
                'id': uniqueid(),
                'name': 'gas',
                'sub_networks': [],
                'pipelines': [

                ]
            }
        ]
    },
    {
        'id': periodid_second,
        'start': 2001,
        'end': 2001,
        # 'sub_periods': [],
        'regions': [
            {
                'id': 'DE',
                # 'sub_regions': [],
                'sites': [
                    {
                        'id': 'first_site_in_germany',
                        'company': companyid_2001,  # => verweist auf periods => companies
                        'plants': [
                            {
                                'id': 'qux',
                                'product': {
                                    'id': 'Ammoniak',
                                    'process': {
                                        'id': 'SMR+HB',
                                        'technologies': [
                                           technologyid_2001_first,  # => verweist auf periods => technologies
                                           technologyid_2001_second
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                ]
            },
            {
                'id': 'FR',
                # 'sub_regions': [],
                'sites': [
                    {
                        'id': 'first_site_in_france',
                        'company': companyid_2001,  # => verweist auf periods => companies
                        'plants': [
                            {
                                'id': 'qux',
                                'product': {
                                    'id': 'Ammoniak',
                                    'process': {
                                        'id': 'SMR+HB',
                                        'technologies': [
                                           technologyid_2001_first,  # => verweist auf periods => technologies
                                           technologyid_2001_second
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        ],
        'companies': [
            {
                'id': companyid_2001,
                'name': 'international_company'
            }
        ],
        'technologies': [
             {
                'id': technologyid_2001_first,
                'name': 'SMR',
                'specific_cost_per_year': 123,
                'specific_energy_consumptions': [
                    {
                        'energy_carrier': energy_carrierid_2001_first,
                        'specific_consumption': 5555
                    },  # => verweist auf periods => energy_carriers
                    {
                         'energy_carrier': energy_carrierid_2001_second,
                         'energy_consumption': 2333
                    }
                ]
             },
             {
                'id': technologyid_2001_second,
                'name': 'HB',
                'specific_cost_per_year': 1234,
                'specific_energy_consumptions': [
                    {
                        'energy_carrier': energy_carrierid_2001_first,
                        'specific_consumption': 555
                    },  # => verweist auf periods => energy_carriers
                    {
                         'energy_carrier': energy_carrierid_2001_second,
                         'energy_consumption': 233
                    }
                ]
             }
        ],
        'energy_carrieriers': [
            {
                'id': energy_carrierid_2001_first,
                'name': 'oil',
                'group': 'fuel'
            },
            {
                'id': energy_carrierid_2001_second,
                'name': 'gas',
                'group': 'fuel'
            },
            {
                'id': uniqueid(),
                'name': 'conventional',
                'group': 'electricity'
            },
            {
                'id': uniqueid(),
                'name': 'green',
                'group': 'electricity'
            }
        ],
        'networks': [
            {
                'id': uniqueid(),
                'name': 'gas',
                'sub_networks': [],
                'pipelines': [

                ]
            },
            {
                'id': uniqueid(),
                'name': 'gas',
                'sub_networks': [],
                'pipelines': [

                ]
            }
        ]
    }
]

r.table('periods') \
.insert(periods) \
.run()

Related:

RethinkDB: RqlRuntimeError: Cannot perform bracket on a sequence of sequences

Upvotes: 0

Views: 125

Answers (1)

Stefan
Stefan

Reputation: 12370

Nested concat_map in combination with r.row operator and bracket drill down does the trick:

r.table('periods') \
.concat_map(r.row['regions']) \
.concat_map(r.row['sites']) \
.concat_map(r.row['plants'])['product']['process'] \
.concat_map(r.row['technologies']) \
.run()

Upvotes: 0

Related Questions