KSchmidAmilar opened a new issue, #72541:
URL: https://github.com/apache/airflow/issues/72541

   ### Under which category would you file this issue?
   
   Providers
   
   ### Apache Airflow version
   
   2.3.2
   
   ### What happened and how to reproduce it?
   
   GoogleDriveFileExistenceSensor behaves inconsistently when checking for 
existing files in a Google Drive folder.
   
   In my case, multiple sensors use the same Google connection, the same folder 
ID, and the same sensor/helper implementation. Only the filename differs. A 
sensor for one existing file succeeds, while sensors for other existing files 
in the same folder repeatedly report that the files do not exist.
   
   For example, the DAG is effectively doing:
   
   ```
   from airflow.providers.google.suite.sensors.drive import 
GoogleDriveFileExistenceSensor
   
   GoogleDriveFileExistenceSensor(
       task_id="check_file",
       folder_id=folder_id,
       file_name=file_name,
   )
   
   ```
   Looking at GoogleDriveHook.get_file_id(), which is ultimately used by 
GoogleDriveFileExistenceSensor, the query is currently constructed as:
   
   ```
   query = f"name = '{file_name}'"
   
   if folder_id:
       query += f" and parents in '{folder_id}'"
   ```
   
   The resulting query is therefore:
   
   `name = 'some_file.csv' and parents in 'FOLDER_ID'
   `
   However, the Google Drive API documents the in operator as an 
element-membership operation. The documented syntax for testing whether a 
folder ID is present in the parents collection is:
   
   'FOLDER_ID' in parents
   
   For example:
   
   name = 'some_file.csv' and 'FOLDER_ID' in parents
   
   There is an additional inconsistency within GoogleDriveHook itself. 
_ensure_folders_exists() already constructs the parent condition using the 
documented order:
   
   f```
   "'{current_parent}' in parents"
   
   while get_file_id() constructs it in the opposite order:
   
   f"parents in '{folder_id}'"
   
   ```
   A minimal test of the two query forms can be performed with the same Airflow 
connection:
   
   ```
   from airflow.providers.google.suite.hooks.drive import GoogleDriveHook
   
   hook = GoogleDriveHook()
   service = hook.get_conn()
   
   folder_id = "FOLDER_ID"
   file_name = "EXISTING_FILE.csv"
   
   # Current Airflow implementation
   print(
       hook.get_file_id(
           folder_id=folder_id,
           file_name=file_name,
       )
   )
   
   # Documented Google Drive query syntax
   result = (
       service.files()
       .list(
           q=f"name = '{file_name}' and '{folder_id}' in parents",
           spaces="drive",
           fields="files(id,name,mimeType,parents)",
       )
       .execute()
   )
   
   print(result)
   ```
   
   The issue is observable through GoogleDriveFileExistenceSensor because 
GoogleDriveHook.exists() delegates to get_file_id() and interprets an empty 
result as the file not existing.
   
   This same get_file_id() query-order problem was previously reported in 
Apache Airflow Discussion #56487, "Suggestion / Hook Improvement: 
GoogleDriveHook.get_file_id", on October 8, 2025. The reporter specifically 
identified the same parents in '<folder_id>' expression and reported that 
changing it to '<folder_id>' in parents resolved their failure to find an 
existing file.
   
   The problematic expression remains present in the current Google provider 
implementation.
   
   ### What you think should happen instead?
   
   GoogleDriveHook.get_file_id() should construct the parent-folder condition 
using the Google Drive API's documented collection-membership syntax:
   
   ```
   if folder_id:
       query += f" and '{folder_id}' in parents"
   
   ```
   instead of:
   
   ```
   if folder_id:
       query += f" and parents in '{folder_id}'"
   
   ```
   This would also make get_file_id() consistent with _ensure_folders_exists() 
in the same GoogleDriveHook, which already uses:
   
   `f"'{current_parent}' in parents"
   `
   GoogleDriveFileExistenceSensor should reliably return True for an accessible 
file whose exact name exists in the specified folder.
   
   ### Operating System
   
   Ubuntu 22.04 LTS
   
   ### Deployment
   
   Other
   
   ### Apache Airflow Provider(s)
   
   google
   
   ### Versions of Apache Airflow Providers
   
   _No response_
   
   ### Official Helm Chart version
   
   Not Applicable
   
   ### Kubernetes Version
   
   _No response_
   
   ### Helm Chart configuration
   
   _No response_
   
   ### Docker Image customizations
   
   _No response_
   
   ### Anything else?
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [x] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to