jameshartig commented on code in PR #1915:
URL: 
https://github.com/apache/cassandra-gocql-driver/pull/1915#discussion_r2462273435


##########
session.go:
##########
@@ -652,114 +653,113 @@ func (s *Session) routingKeyInfo(ctx context.Context, 
stmt string, keyspace stri
        inflight := new(inflightCachedEntry)
        inflight.wg.Add(1)
        defer inflight.wg.Done()
-       s.routingKeyInfoCache.lru.Add(routingKeyInfoCacheKey, inflight)
-       s.routingKeyInfoCache.mu.Unlock()
-
-       var (
-               info         *preparedStatment
-               partitionKey []*ColumnMetadata
-       )
+       s.routingMetadataCache.lru.Add(key, inflight)
+       s.routingMetadataCache.mu.Unlock()
 
-       conn := s.getConn()
-       if conn == nil {
-               // TODO: better error?
-               inflight.err = errors.New("gocql: unable to fetch prepared 
info: no connection available")
-               return nil, inflight.err
-       }
-
-       // get the query info for the statement
-       info, inflight.err = conn.prepareStatement(ctx, stmt, nil, keyspace)
+       var meta StatementMetadata
+       meta, inflight.err = s.StatementMetadata(ctx, stmt, keyspace)
        if inflight.err != nil {
                // don't cache this error
-               s.routingKeyInfoCache.Remove(stmt)
+               s.routingMetadataCache.Remove(key)
                return nil, inflight.err
        }
 
-       // TODO: it would be nice to mark hosts here but as we are not using 
the policies
-       // to fetch hosts we cant
+       inflight.value = &meta
 
-       if info.request.colCount == 0 {
-               // no arguments, no routing key, and no error
-               return nil, nil
-       }
+       return &meta, nil
+}
 
-       table := info.request.table
-       if info.request.keyspace != "" {
-               keyspace = info.request.keyspace
-       }
+// StatementMetadata represents various metadata about a statement.
+type StatementMetadata struct {
+       // Keyspace is the keyspace of the table for the statement.
+       Keyspace string
 
-       if len(info.request.pkeyColumns) > 0 {
-               // proto v4 dont need to calculate primary key columns
-               types := make([]TypeInfo, len(info.request.pkeyColumns))
-               for i, col := range info.request.pkeyColumns {
-                       types[i] = info.request.columns[col].TypeInfo
-               }
+       // Table is the table of the statement.
+       Table string
 
-               routingKeyInfo := &routingKeyInfo{
-                       indexes:  info.request.pkeyColumns,
-                       types:    types,
-                       keyspace: keyspace,
-                       table:    table,
-               }
+       // BindColumns are columns bound to the statement.
+       BindColumns []ColumnInfo
 
-               inflight.value = routingKeyInfo
-               return routingKeyInfo, nil
-       }
+       // PKBindColumnIndexes are the indexes of the BindColumns that 
correspond to
+       // partition key columns. If this is empty then one or more columns in 
the
+       // partition key were not bound to the statement.
+       PKBindColumnIndexes []int
 
-       var keyspaceMetadata *KeyspaceMetadata
-       keyspaceMetadata, inflight.err = 
s.KeyspaceMetadata(info.request.columns[0].Keyspace)
-       if inflight.err != nil {
-               // don't cache this error
-               s.routingKeyInfoCache.Remove(stmt)
-               return nil, inflight.err
+       // ResultColumns are the columns that are returned by the statement.
+       ResultColumns []ColumnInfo
+}
+
+// StatementMetadata returns metadata for a statement. If keyspace is empty,

Review Comment:
   I went back and forth on this. I documented in the commit message the 
reasoning but essentially I didn't want to impose a cache that the user 
couldn't invalidate. It seems simple enough for the user to do their own 
caching if they need to.
   
   I'm not opposed to adding a cache here but then we'd need a way to 
invalidate it. 



-- 
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]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to