You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: eliminate_cross_join.rs
    path of file: ./repos/arrow-datafusion/datafusion/optimizer/src
    
    the code of the file until where you have to start completion: // Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional informa
    
fn extract_possible_join_keys(expr: &Expr, accum: &mut Vec<(Expr, Expr)>) -> Result<()> {
    if let Expr::BinaryExpr(BinaryExpr { left, op, right }) = expr {
        match op {
            Operator::Eq => {
                // Ensure that we don't add the same Join keys multiple times
                if !(accum.contains(&(*left.clone(), *right.clone()))
                    || accum.contains(&(*right.clone(), *left.clone())))
                {
                    accum.push((*left.clone(), *right.clone()));
                }
            }
            Operator::And => {
                extract_possible_join_keys(left, accum)?;
                extract_possible_join_keys(right, accum)?
            }
            // Fix for issue#78 join predicates from inside of OR expr also pulled up properly.
            Operator::Or => {
                let mut left_join_keys = vec![];
                let mut right_join_keys = vec![];

                extract_possible_join_keys(left, &mut left_join_keys)?;
                extract_possible_join_keys(right, &mut right_join_keys)?;

                intersect(accum, &left_join_keys, &right_join_keys)
            }
            _ => (),
        };
    }
    Ok(())
}