Hi Offray - could you try modifying SSWReStore>>createProxyForNewObject: as 
follows:

        ...
     table := self tableForClass: anObject class.
"Add this ->”  table isNil ifTrue: [ self error: 'cannot find table for ', 
anObject class name ].
      id := table idDataField ifNotNil: [ :idDataField | idDataField accessor 
valueIn: anObject].
      …

This should change the error message to show the class of object which doesn’t 
have a valid table.

Thanks.

John


> On 7 Apr 2022, at 20:29, Offray Vladimir Luna Cárdenas 
> <offray.l...@mutabit.com> wrote:
> 
> Hi John,
> 
> Effectively ReStore didn't was storing the table object for the Nitter class. 
> But after following your advice, i'm now able to debug both the TwitterUser 
> and the NitterUser and obtain the same result (which makes sense as the later 
> is inherited from the former). I think that my error was related with the 
> definition of the synchronized tables, as I was not including  explicitly the 
> NitterUser (as I thought it would suffice with the TwitterUser one). Now it 
> looks like this:
> 
> ===
> ReStore connection: (SSWSQLite3Connection on: privateDatabase fullName); 
>     connect; 
>     addClasses: { Tweet. "TwitterUser." NitterUser }; 
>     synchronizeAllClasses.
> ===
> Now I can get a non nil idDataField that has the same shape when 
> #tableForClass: and "reStoreDefinition asTableIn: ReStore" are send to 
> TwitterUser and NitterUser. Despite of that I still get the pre-commit error: 
> "#idDataField was send to nil". Here is a screenshot of the trace of the 
> error and the idDataFiled seems right (or at least equal to the same field in 
>  the TwitterUser):
> https://i.imgur.com/F3UDC93.png <https://i.imgur.com/F3UDC93.png>
> For the moment, I'm planing to use an extra/temporal TwitterStoreHelper 
> object that stores via ReStore/SQLite the objects I'm unable to store so far, 
> but as dictionaries of key/value helper objects, where the value is just the 
> STON serialization of the object (with the inconveniences of not being able 
> to query it properly). For example, a 'profiles' dictionary in 
> TwitterStoreHelper would have a Twitter/Nitter user id as a key and its Ston 
> representation as a value. It's a temporal workaround, while I debug the 
> above error further.
> I'll keep you posted on the advances and regarding the booklet, I answered 
> you in a direct message.
> 
> Cheers,
> 
> Offray
> On 7/04/22 2:59, John Aspinall wrote:
>> Hi Offray,
>> 
>> Regarding the error, I’m guessing that ReStore doesn’t have a table object 
>> for your NitterUser class for some reason. Could you try:
>> 
>>    myReStore tableForClass: NitterUser
>> 
>> …and check if this is returning nil? If so there’s an issue with creating 
>> the table for the class; you could try stepping through
>> 
>>    NitterUser reStoreDefinition asTableIn: myReStore
>> 
>> ...to get an idea of what’s wrong.
>> 
>> If this isn’t the issue please let me know.
>> 
>> Regarding the manual, I’ll send this to you by mail.
>> 
>> Cheers.
>> 
>> John
>> 
>> 
>> 
>>> On 6 Apr 2022, at 19:48, Offray Vladimir Luna Cárdenas 
>>> <offray.l...@mutabit.com <mailto:offray.l...@mutabit.com>> wrote:
>>> 
>>> Thanks Jhon, it definitively helps.
>>> 
>>> What I did was to extract some important metadata as slots of the Tweet 
>>> object and made explicit the authorId, which allows me to trace tweets 
>>> authorship:
>>> 
>>> ===
>>> Tweet>>class #reStoreDefinition 
>>> ^ super reStoreDefinition 
>>>     defineAsID: #id; 
>>>     define: #text as: String; 
>>>     define: #created as: String; 
>>>     define: #authorId as: String; 
>>>     define: #timelines as: (Dictionary of: String -> String); yourself
>>> 
>>> ===
>>> Also I'm going to put in the radar the idea of storing STON strings for 
>>> metadata residues.
>>> 
>>> On a related matter, I'm still unable to store properly the NitterUser, 
>>> which inherits from TwitterUser  into SQLite and always get a pre-commit 
>>> error: "#idDataField was send to nil" when I ran "myNitterUser store". Here 
>>> is my TwitterUser storing definition:
>>> 
>>> ===
>>> TwitterUser>>class #reStoreDefinition 
>>>     ^ super reStoreDefinition 
>>>             defineAsID: #id; 
>>>             define: #userName as: String; 
>>>             define: #profileImageUrl as: String; 
>>>             define: #profileBio as: String; 
>>>             "define: #createdAt as: String;" 
>>>             yourself.
>>> 
>>> ===
>>> 
>>> What I'm missing? And more importantly: how can I debug the message, so I 
>>> can asign the proper non nil object as receiver of #idDataField ?
>>> 
>>> Finally (for now ;-) ), the ReStore manual has been and important learning 
>>> resource. Are you the author? And if so, would you be so kind to upload the 
>>> Word source code to the Documentation/ folder in the repository under a 
>>> permissive license that allow at least some format changes? We would like 
>>> to add some table of contents and translate it to other formats, as we have 
>>> done before with other free/libre cultural works (see [1] [2]).
>>> 
>>> [1] https://mutabit.com/repos.fossil/datafem 
>>> <https://mutabit.com/repos.fossil/datafem>
>>> [2] https://mutabit.com/repos.fossil/mapeda/ 
>>> <https://mutabit.com/repos.fossil/mapeda/>
>>> 
>>> Thanks,
>>> 
>>> Offray
>>> On 6/04/22 2:52, John Aspinall wrote:
>>>> Hi Offray, 
>>>> 
>>>> You’re correct that ReStore can’t store that kind of mixed dictionary 
>>>> directly. You could store the entire STON text as one string and reify it 
>>>> on read, though that would mean you can’t easily query on the metadata. 
>>>> 
>>>> A compromise solution would be to define objects and slots for the key 
>>>> data you’d need to query on and a STON string for the residue. This could 
>>>> be a better solution anyway as excessive/complex Dictionaries can be a 
>>>> sign that you need to define a new class/classes. For your particular 
>>>> project this would depend on how similar the metadata is between tweets - 
>>>> if there’s not much commonality then a Dictionary approach may be more 
>>>> appropriate. 
>>>> 
>>>> Hope this helps,
>>>> 
>>>> John
>>>> 
>>>> 
>>>> 
>>>>> On 5 Apr 2022, at 20:07, Offray Vladimir Luna Cárdenas 
>>>>> <offray.l...@mutabit.com <mailto:offray.l...@mutabit.com>> wrote:
>>>>> 
>>>>> Hi all,
>>>>> 
>>>>> First of all, despite of being on a non-directly related matter with my 
>>>>> question, congrats of Pharo 10.
>>>>> 
>>>>> We (as now we have 2 active Smalltalkers in my country... Yay!) are 
>>>>> creating a civic tech project with Pharo/Lepiter and we would like to 
>>>>> store some Tweet metadata coming from Nitter[1]. As we're dealing with 
>>>>> the differences between the official Twitter API and the unofficial 
>>>>> Nitter one, we put the metadata we need in a dictionary that has several 
>>>>> kinds of objects, from ordered collections to other dictionaries. 
>>>>> [1] https://nitter.net/about <https://nitter.net/about>
>>>>> Currently if we serialize a Tweet object in STON, we get this:
>>>>> 
>>>>> Tweet { #created : 'Tue, 05 Apr 2022 12:37:56 GMT', #text : '
>>>>> 
>>>>> [ANN] Pharo 10 Released: pharo.org/news/pharo10-relea… 
>>>>> <https://pharo.org/news/pharo10-released>\n', #id : 
>>>>> '1511322244353597443', #user : NitterUser { #userName : 'pharoproject', 
>>>>> #profileImageUrl : URL [ 
>>>>> 'http://nitter.42l.fr/pic/pbs.twimg.com/profile_images/541743734/icone-pharo-1_400x400.png
>>>>>  
>>>>> <http://nitter.42l.fr/pic/pbs.twimg.com/profile_images/541743734/icone-pharo-1_400x400.png>'
>>>>>  ] }, #metadata : { 'queries' : OrderedCollection [ { 'date' : 
>>>>> DateAndTime [ '2022-04-05T13:36:58.546011-05:00' ], 'parameters' : 
>>>>> 'https://nitter.42l.fr/pharoproject <https://nitter.42l.fr/pharoproject>' 
>>>>> } ], 'timelines' : { 'pharoproject' : '1511048498703126529' } } }
>>>>> As you can see, the metadata slot contains a dictionary with mixed 
>>>>> classes of objects. But I read in the ReStore manual[2] (pg 14):
>>>>> 
>>>>> """
>>>>> 
>>>>> Like other collections, the class of elements for both key and value can 
>>>>> be any other
>>>>> persistent class, and will be the same for all elements of that 
>>>>> collection (except in the case of
>>>>> inheritance).
>>>>> """
>>>>> So, is ReStore unable to store metadata dictionaries like the one 
>>>>> described in the previous STON code? if this is possible, how can I 
>>>>> define it in the Tweet class>>reStoreDefinition? 
>>>>> For the moment, I'm going to create a explicit "timelines" slot to store 
>>>>> what was being stored at the #timelines key of the metadata dictionary. 
>>>>> But, as metadata increases, instead of moving variables previously inside 
>>>>> of a dictionary as explicit slots of an object, I think that having a 
>>>>> explicit way of storing dictionaries with different kinds of objects, in 
>>>>> contrast with only uniform ones, would be needed (but I don't know if 
>>>>> this is in the design scope of ReStore).
>>>>> 
>>>>> BTW, Lepiter has allow us to build a pretty fluent interface to browser 
>>>>> Twitter/Nitter profiles and messages. Here it is how such UI looks for 
>>>>> browsing last @pharoproject tweets:
>>>>> 
>>>>> https://i.imgur.com/bxFze1g.png <https://i.imgur.com/bxFze1g.png>
>>>>> Any help on how to use ReStore in storing mixed dictionaries is 
>>>>> appreciated.
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>> Offray
>>>> 
>> 

Reply via email to