#243 closed enhancement (fixed)
Mejora de los métodos GetObject y GetObjects
Reported by: | jconde | Owned by: | Pedro Gea |
---|---|---|---|
Priority: | minor | Milestone: | Release 0.5 |
Component: | General | Keywords: | variables, GetVariable, selector |
Cc: |
Description
El metodo GetVariable devuelve una variable a partir de "información de la variable" (es basicamente su nombre, no?). Se pude mejorar el método (y en general todos los metodos GetObjeto), para que se seleccione el objeto a partir de cualquiera de los atributos que tiene.
Ejemplo:
si un objeto variable tiene los atributos _.name y _.tags, se puede indicar algo del estilo
GetVariable("_.name", "NombreDelObjeto1", "NombreDelObjeto2", ...?)
GetVariable("_.tags", "tag1", "tag2", ...?)
Ademas seria interesante que se permitiera también indicar si se quiere que la selección sea del tipo unión o intersección, es decir, si se seleccionan los objetos que tienen alguna de las opciones pasadas o todas ellas.
Change History (5)
comment:1 Changed 15 years ago by
Component: | Variables → General |
---|---|
Milestone: | → Future |
Owner: | set to Pedro Gea |
Priority: | major → minor |
Summary: | mejora metodo GetVariable → Mejora de los métodos GetObject y GetObjects |
version: | 0.5 |
comment:2 Changed 15 years ago by
No entiendo el comentario, sobre todo los puntos de "no aporta una funcionalidad indispensable para trabajar" o "las etiquetas (tags) por ahora cumplen una función más bien decorativa".
Intento explicar mejor el ticket:
Se requiere un metodo que permita seleccionar un conjunto de variables (u objetos MMs, de forma genérica) a partir de los valores de sus atributos. Si el objeto tiene atributos, estos son indispensables, por lo tanto se puede querer seleccionar objetos a traves de ellos.
El ejemplo de los tags es fundamental: estos son indispensables para trabajar con MMS, especialmente cuando haya masividad. De hecho, como se pretende filtrar objetos en la interfaz gráfica? Se tendrá que acceder a los atributos (tags en este caso) y seleccionar los que cumplan las propiedades deseadas, cierto?
Escribo un ejemplo de función que se esta utilizando. No se muy bien si se deberia llamar Search, Get, Select u otra cosa.
Set VariablesSelector(NameBlock selOptions)
{
Tomamos las variables definidas en el conjunto, o si hay error todas las
variables MMS
Set variables = If(ObjectExist("Set", "selOptions::_.variables"),
selOptions::_.variables,
MMS::GetVariables(0)
);
Seleccionamos por el atributo name
Set name = If(
ObjectExist("Set", "selOptions::_.name"),
{
BinGroup("<<",
EvalSet(selOptions::_.name, Set (Text txt)
{
Select(variables, Real (@MMS.Variable st)
{st::GetName(0) == txt})
})
)
},
variables
);
Seleccionamos por el atributo scenario
Set scenario = If(
ObjectExist("Set", "selOptions::_.scenario"),
{
BinGroup("<<",
EvalSet(selOptions::_.scenario, Set (Text txt)
{
Select(name, Real (@MMS.Variable st)
{st::GetScenario(0) == txt})
})
)
},
name
);
Seleccionamos por el atributo description
Set description = If(
ObjectExist("Set", "selOptions::_.description"),
{
BinGroup("<<",
EvalSet(selOptions::_.description, Set (Text txt)
{
Select(scenario, Real (@MMS.Variable st)
{st::GetDescription(0) == txt})
})
)
},
scenario
);
Seleccionamos por el atributo source
Set source = If(
ObjectExist("Set", "selOptions::_.source"),
{
BinGroup("<<",
EvalSet(selOptions::_.source, Set (Text txt)
{
Select(description, Real (@MMS.Variable st)
{st::GetSource(0) == txt})
})
)
},
description
);
Seleccionamos por el atributo expression
Set expression = If(
ObjectExist("Set", "selOptions::_.expression"),
{
BinGroup("<<",
EvalSet(selOptions::_.expression, Set (Text txt)
{
Select(source, Real (@MMS.Variable st)
{st::GetExpression(0) == txt})
})
)
},
source
);
Seleccionamos por el atributo tags
nos quedamos con las opciones que contienen todos los tags pasados
Set tags = If(
ObjectExist("Set", "selOptions::_.tags"),
{
Select(expression, Real (@MMS.Variable st)
{
Real tagIn = SetSum(
EvalSet(selOptions::_.tags, Real(Text txt){
txt <: st::GetTags(0)
})
);
Eq(tagIn, Card(selOptions::_.tags))
})
},
expression
);
Seleccionamos por el atributo datesDef
nos quedamos con aquellas variables que sean NO nulas entre datesDef
Set datesDef = If(
ObjectExist("Set", "selOptions::_.datesDef"),
{
WriteLn("seleccionando variables por fecha... "+ Time);
Date minD = selOptions::_.datesDef[1];
WriteLn(" minD: "<< minD +" ... "+ Time);
Date maxD = selOptions::_.datesDef[2];
WriteLn(" maxD: "<< maxD +" ... "+ Time);
Select(tags, Real(@MMS.Variable var)
{
Real varMin = MinS(var::GetData(?), minD, maxD);
Real varMax = MaxS(var::GetData(?), minD, maxD);
Real varNull = EQ(varMin, varMax, 0);
Not(varNull)
})
},
tags
)
};
PutDescription("
Selecciona elementos del contenedor de variables de MMS se accede a el a
través de los atributos del mismo. La selección incluye todas las opciones
seleccionadas menos en los tags, donde busca el objeto que los tiene todos.
",
VariablesSelector);
comment:3 Changed 15 years ago by
Está claro que no nos entendemos bien.
Cuando digo que no es indispensable es que esa selección la puedes hacer tú mismo, ya que tienes acceso a los atributos de los objetos.
Tampoco hay una función que dado un conjunto de reales te dé los negativos, pero coges todo el conjunto y haces un Select
como mejor te convenga.
No tiene sentido hacer un "Select de MMS" cuando ya hay uno en TOL.
Sobre lo de las etiquetas, como bien te decía "por ahora" no hay nada implementado en MMS que las utilice.
Creo que no hacía falta poner ese ejemplo, está claro qué es lo que buscas en ese tipo de objetos, pero yo podría ponerte otras opciones de búsqueda que no has tenido en cuenta: que tengan la misma gramática, que siendo series tengan el mismo fechado, que su valor a día de hoy sea omitido, que sus nombres sigan el patrón "*loquesea", que en la descripción aparezca la palabra "diario" tanto en mayúsculas como no, que no contengan determinada etiqueta salvo que su nombre sea "unoconcreto", etc.
Creo sinceramente que a nivel de código, cada uno puede construirse los selectores que necesite. Otra cosa son los métodos de selección específicos que se construyan con la interfaz.
comment:4 Changed 15 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Desvío la necesidad de métodos de filtrado especiales para las variables a los que necesite la interfaz gráfica de usuario: #268.
Creo que con el ejemplo que allí se expone queda claro que no es fácil replicar las posibilidades que aporta el Select
sin desarrollar toda una sintaxis equivalente.
En principio, doy por cerrado estas necesidades desde el punto de vista de la creación de métodos generales. Si se encuentran necesidades de métodos específicos para la interfaz gráfica o para otra aplicación, pueden generarse tiques específicos o reabrirse éste.
comment:5 Changed 15 years ago by
Milestone: | Future → Release 0.5 |
---|
Hola,
está claro que puede ser muy interesante esta sobrecarga de los métodos Get<Object> y Get<Object>s. Sin embargo, creo que aunque facilite el uso de MMS, no aporta una funcionalidad indispensable para trabajar.
Actualmente algunos objetos admiten cierta sobrecarga en sus métodos, aunque esto no está generalizado:
Get<Object>(Anything info)
Get<Object>s(Anything options)
Además de una razonable sobrecarga de estos métodos, propones otras tareas como buscar en algunos de sus atributos que más bien corresponderían a un método Search<Object>s.
Sobre el caso concreto de GetVariable, las etiquetas (tags) por ahora cumplen una función más bien decorativa. En cualquier caso, siempre puedes hacer la búsqueda tú mismo con expresiones
del tipo: