davidhamann / python-fmrest

Python wrapper around the FileMaker Data API
MIT License
100 stars 27 forks source link

Similar queries yield different foundset #38

Closed Minkiu closed 3 years ago

Minkiu commented 3 years ago

Hello there!

Thanks again for this fantastic library.

I am experiencing a odd situation, two seemingly similar find() yield different data against a self-hosted instance:

quote_id = '<id-of-another-table>'

results1 = fm_session.find([
    {'_sk_Quote_ID': quote_id}
])

results2 = fm_session.find([
    {
        '_sk_Quote_ID': quote_id,
        'd__AnotherField': 'BEEP BOOP'
    }
])

Looping through the first foundset:

for record in results1:
    if record.d__AnotherField == 'BEEP BOOP':
        print(record.to_dict())

Nothing gets printed

Then printing the results of the second foundset outputs what I expected in the previous loop.

for record in results2:
    print(record.to_dict())

I also tried printing the d__AnotherField field and they are missing

for record in results1:
    print(record.d__AnotherField)

But none of the printed values match "BEEP BOOP" as if they weren't there.

Any idea why are those records are missing from the results1?

I can see though the webui/app that those are there, plus the second query also returns what's expected.

davidhamann commented 3 years ago

Thanks for checking in. Unfortunately, I'm not sure I follow.

I created a test file (admin/admin): test_beep_boop.fmp12.zip

Then I ran your code:

fm_session = fmrest.Server('https://my-server.com',
                    user='admin',
                    password='admin',
                    database='test_beep_boop',
                    layout='SomeTable',
                    verify_ssl=True
                   )

fm_session.login()

quote_id = 'B41E0BBC-67E4-4AE3-813F-585E6650F948'

results1 = fm_session.find([
    {'_sk_Quote_ID': quote_id}
])

results2 = fm_session.find([
    {
        '_sk_Quote_ID': quote_id,
        'd__AnotherField': 'BEEP BOOP'
    }
])

print('Printing first')
for record in results1:
    if record.d__AnotherField == 'BEEP BOOP':
        print(record.to_dict())

print('Printing second')
for record in results2:
    print(record.to_dict())

fm_session.logout()

This results in:

Printing first
{'_sk_Quote_ID': 'B41E0BBC-67E4-4AE3-813F-585E6650F948', 'd__AnotherField': 'BEEP BOOP', 'recordId': '1', 'modId': '2'}
{'_sk_Quote_ID': 'B41E0BBC-67E4-4AE3-813F-585E6650F948', 'd__AnotherField': 'BEEP BOOP', 'recordId': '2', 'modId': '2'}
Printing second
{'_sk_Quote_ID': 'B41E0BBC-67E4-4AE3-813F-585E6650F948', 'd__AnotherField': 'BEEP BOOP', 'recordId': '1', 'modId': '2'}
{'_sk_Quote_ID': 'B41E0BBC-67E4-4AE3-813F-585E6650F948', 'd__AnotherField': 'BEEP BOOP', 'recordId': '2', 'modId': '2'}

Do you have different results? If yes, could you maybe create a minimal test file and provide it here?

Minkiu commented 3 years ago

Hey sorry for the late reply, I do see different results, I don't get anything on the Printing first of your example.

I will try tomorrow get some time on this, and provide better feedback, not sure about the example data since it's under NDAs most likely.

Minkiu commented 3 years ago

Hey,

so I had time to look at this and sorted it, the find wasn't returning all the data cause there's the default limit to 100 records and the ones I wanted where probably out of the cut...

Sorry about this, it's even in the the finding data example... :facepalm: "Defaults are offset 1 (which is the first record), limit 100."

Thanks again for the nice package :)