nrtsearch icon indicating copy to clipboard operation
nrtsearch copied to clipboard

Create runtime fields

Open vim345 opened this issue 1 year ago • 2 comments

The following query works now. It supports all the numeric values, strings, maps and lists.

{
  "indexName": "testRuntime",
  "startHit": 0,
  "topHits": 5,
  "retrieveFields": [
    "vendor_name",
    "license_no",
    "v1",
    "r1",
    "r2",
    "r3",
    "r4",
    "r5",
    "r6"
  ],
  "runtimeFields": [
    {
      "name": "r1",
      "script": {
        "lang": "painless",
        "source": "return Collections.singletonMap('key', 2.5);"
      }
    },
    {
      "name": "r2",
      "script": {
        "lang": "painless",
        "source": "return false;"
      }
    },
    {
      "name": "r3",
      "script": {
        "lang": "painless",
        "source": "Map map = Collections.singletonMap('internalKey', 2.5); return Collections.singletonMap('key', map);"
      }
    },
    {
      "name": "r4",
      "script": {
        "lang": "painless",
        "source": "List nums = new ArrayList(); nums.add('1'); nums.add('2'); return nums;"
      }
    },
    {
      "name": "r5",
      "script": {
        "lang": "painless",
        "source": "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
      }
    },
    {
      "name": "r6",
      "script": {
        "lang": "painless",
        "source": "Map map = Collections.singletonMap('key', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
      }
    }
  ],
  "virtualFields": [
    {
      "name": "v1",
      "script": {
        "lang": "painless",
        "source": "return 2 * 4.0;"
      }
    }
  ]
}

Which gave me the following:

[INFO ] 2024-03-18 15:49:57.012 [main] LuceneServerClientBuilder$SearchClientBuilder - Converting fields {
  "indexName": "testRuntime",
  "startHit": 0,
  "topHits": 5,
  "retrieveFields": [
    "vendor_name",
    "license_no",
    "v1",
    "r1",
    "r2",
    "r3",
    "r4",
    "r5",
    "r6"
  ],
  "runtimeFields": [
    {
      "name": "r1",
      "script": {
        "lang": "painless",
        "source": "return Collections.singletonMap('key', 2.5);"
      }
    },
    {
      "name": "r2",
      "script": {
        "lang": "painless",
        "source": "return false;"
      }
    },
    {
      "name": "r3",
      "script": {
        "lang": "painless",
        "source": "Map map = Collections.singletonMap('internalKey', 2.5); return Collections.singletonMap('key', map);"
      }
    },
    {
      "name": "r4",
      "script": {
        "lang": "painless",
        "source": "List nums = new ArrayList(); nums.add('1'); nums.add('2'); return nums;"
      }
    },
    {
      "name": "r5",
      "script": {
        "lang": "painless",
        "source": "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
      }
    },
    {
      "name": "r6",
      "script": {
        "lang": "painless",
        "source": "Map map = Collections.singletonMap('key', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
      }
    }
  ],
  "virtualFields": [
    {
      "name": "v1",
      "script": {
        "lang": "painless",
        "source": "return 2 * 4.0;"
      }
    }
  ]
}
 to proto SearchRequest
[INFO ] 2024-03-18 15:49:57.093 [main] LuceneServerClientBuilder$SearchClientBuilder - jsonStr converted to proto SearchRequest: 
indexName: "testRuntime"
topHits: 5
retrieveFields: "vendor_name"
retrieveFields: "license_no"
retrieveFields: "v1"
retrieveFields: "r1"
retrieveFields: "r2"
retrieveFields: "r3"
retrieveFields: "r4"
retrieveFields: "r5"
retrieveFields: "r6"
virtualFields {
  script {
    lang: "painless"
    source: "return 2 * 4.0;"
  }
  name: "v1"
}
runtimeFields {
  script {
    lang: "painless"
    source: "return Collections.singletonMap(\'key\', 2.5);"
  }
  name: "r1"
}
runtimeFields {
  script {
    lang: "painless"
    source: "return false;"
  }
  name: "r2"
}
runtimeFields {
  script {
    lang: "painless"
    source: "Map map = Collections.singletonMap(\'internalKey\', 2.5); return Collections.singletonMap(\'key\', map);"
  }
  name: "r3"
}
runtimeFields {
  script {
    lang: "painless"
    source: "List nums = new ArrayList(); nums.add(\'1\'); nums.add(\'2\'); return nums;"
  }
  name: "r4"
}
runtimeFields {
  script {
    lang: "painless"
    source: "List nums = new ArrayList(); nums.add(1); nums.add(2); return nums;"
  }
  name: "r5"
}
runtimeFields {
  script {
    lang: "painless"
    source: "Map map = Collections.singletonMap(\'key\', 2.5); List maps = new ArrayList(); maps.add(map); maps.add(map); return maps;"
  }
  name: "r6"
}

[INFO ] 2024-03-18 15:49:57.219 [main] LuceneServerClient - Server returned : diagnostics {
  firstPassSearchTimeMs: 1.395666
  getFieldsTimeMs: 7.184209
}
totalHits {
  value: 2
}
hits {
  score: 1.0
  fields {
    key: "license_no"
    value {
      fieldValue {
        intValue: 100
      }
      fieldValue {
        intValue: 200
      }
    }
  }
  fields {
    key: "r1"
    value {
      fieldValue {
        structValue {
          fields {
            key: "key"
            value {
              number_value: 2.5
            }
          }
        }
      }
    }
  }
  fields {
    key: "r2"
    value {
      fieldValue {
        booleanValue: false
      }
    }
  }
  fields {
    key: "r3"
    value {
      fieldValue {
        structValue {
          fields {
            key: "key"
            value {
              struct_value {
                fields {
                  key: "internalKey"
                  value {
                    number_value: 2.5
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  fields {
    key: "r4"
    value {
      fieldValue {
        repeatedFieldValues {
          textValues: "1"
          textValues: "2"
        }
      }
    }
  }
  fields {
    key: "r5"
    value {
      fieldValue {
        repeatedFieldValues {
          intValues: 1
          intValues: 2
        }
      }
    }
  }
  fields {
    key: "r6"
    value {
      fieldValue {
        repeatedFieldValues {
          structValues {
            fields {
              key: "key"
              value {
                number_value: 2.5
              }
            }
          }
          structValues {
            fields {
              key: "key"
              value {
                number_value: 2.5
              }
            }
          }
        }
      }
    }
  }
  fields {
    key: "v1"
    value {
      fieldValue {
        doubleValue: 8.0
      }
    }
  }
  fields {
    key: "vendor_name"
    value {
      fieldValue {
        textValue: "first vendor"
      }
    }
  }
}
hits {
  luceneDocId: 1
  score: 1.0
  fields {
    key: "license_no"
    value {
      fieldValue {
        intValue: 111
      }
      fieldValue {
        intValue: 222
      }
    }
  }
  fields {
    key: "r1"
    value {
      fieldValue {
        structValue {
          fields {
            key: "key"
            value {
              number_value: 2.5
            }
          }
        }
      }
    }
  }
  fields {
    key: "r2"
    value {
      fieldValue {
        booleanValue: false
      }
    }
  }
  fields {
    key: "r3"
    value {
      fieldValue {
        structValue {
          fields {
            key: "key"
            value {
              struct_value {
                fields {
                  key: "internalKey"
                  value {
                    number_value: 2.5
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  fields {
    key: "r4"
    value {
      fieldValue {
        repeatedFieldValues {
          textValues: "1"
          textValues: "2"
        }
      }
    }
  }
  fields {
    key: "r5"
    value {
      fieldValue {
        repeatedFieldValues {
          intValues: 1
          intValues: 2
        }
      }
    }
  }
  fields {
    key: "r6"
    value {
      fieldValue {
        repeatedFieldValues {
          structValues {
            fields {
              key: "key"
              value {
                number_value: 2.5
              }
            }
          }
          structValues {
            fields {
              key: "key"
              value {
                number_value: 2.5
              }
            }
          }
        }
      }
    }
  }
  fields {
    key: "v1"
    value {
      fieldValue {
        doubleValue: 8.0
      }
    }
  }
  fields {
    key: "vendor_name"
    value {
      fieldValue {
        textValue: "second vendor"
      }
    }
  }
}
searchState {
  timestamp: 1710802197
  searcherVersion: 4
  lastDocId: 1
  lastScore: 1.0
}

vim345 avatar Feb 22 '24 22:02 vim345

@aprudhomme thank you for reviewing this. I applied your suggestions. Can you please take a look at this to see if the overall design is good enough so that I can create tests for this PR? I will try to support map and list types with the test commit .

vim345 avatar Mar 14 '24 00:03 vim345

@aprudhomme can you please take a look at this? I think the failing tests are flaky ones that don't have anything to do with my changes. I

vim345 avatar Mar 21 '24 00:03 vim345

@aprudhomme can you take a look at this when you get a chance?

vim345 avatar May 15 '24 21:05 vim345