Skip to content

Instantly share code, notes, and snippets.

@ondrejhlavacek
Last active August 29, 2015 14:19
Show Gist options
  • Select an option

  • Save ondrejhlavacek/2b55540bd7e86f514a6e to your computer and use it in GitHub Desktop.

Select an option

Save ondrejhlavacek/2b55540bd7e86f514a6e to your computer and use it in GitHub Desktop.
Metadata API

Čtení a příklady dat

COMPONENTS

GET metadata/project/components
?

GET metadata/buckets/in.c-ex-salesforce-main/components
{
	"ex-salesforce": [
		{
			"key": "last-imported",
			"datatype": "date",
			"value": "2015-03-10 10:05:57"
		}	
	]
}

GET metadata/tables/in.c-ex-salesforce-main.opportunity/components
{
	"ex-salesforce": [
		{
			"key": "entity",
			"datatype": "string",
			"value": "opportunity"
		}	
	],
	"luckyguess": [
		{
			"key": "identity", 
			"datatype": "string",
			"value": "Id"
		}	
	]
}

GET metadata/columns/in.c-ex-salesforce-main.opportunity.value/components
{
	"ex-salesforce": [
		{
			"key": "datatype",
			"datatype": "string",
			"value": "price"
		}	
	],
	"luckyguess": [
		{
			"key": "datatype",
			"datatype": "string",
			"value": "decimal"
		},
		{
			"key": "average",
			"datatype": "number",
			"value": 1533.5
		},				
		{
			"key": "median",
			"datatype": "number",
			"value": 1000
		},				
		{
			"key": "distinct-values",
			"datatype": "number",
			"value": 534
		},						
		{
			"key": "histogram-file-id",
			"datatype": "string",
			"value": "159868726"
		}
	]
}

GET metadata/files/49893879782934/components
{
	"breezy-xls2csv": [
		{
			"key": "processed",
			"datatype": "string",
			"value": "404939723"
		}
	]
]

CORE

Sloučil jsem CORE a USER a TAGS přejmenoval na USER

GET metadata/buckets/in.c-ex-salesforce-main/core
[
	{
		"key": "name",
		"datatype": "string",
		"value": "Salesforce Main"
	}	
]

GET metadata/tables/in.c-ex-salesforce-main.opportunity/core
[
	{
		"key": "size",
		"datatype": "number",
		"value": 23439834
	},
	{
		"key": "rows",
		"datatype": "number",
		"value": 498332
	},
	{
		"key": "name",
		"datatype": "string",
		"value": "Opportunity"
	},
	{
		"key": "description",
		"datatype": "string",
		"value": "Table Description"
	}			


]

GET metadata/columns/in.c-ex-salesforce-main.opportunity.value/core
[
	{
		"key": "name",
		"datatype": "string",
		"value": "Opportunity Value"
	}
]

GET metadata/files/49893879782934/core
[
	{
		"key": "size",
		"datatype": "number",
		"value": 214984
	},
	{
		"key": "uploaded",
		"datatype": "date",
		"value": "2014-12-11 05:48:17"		
	},
	{
		"key": "name",
		"datatype": "string",
		"value": "Monthly Review.xlsx"
	}	
]

USER

Nevím, jak udělat tagy v současný podobě, kdy to je prostě jen text... čistě jako value (datatype defaultně string), aby se udržela key-value struktura a umožnilo se vyhledávání? Ono mít tam key-value může bejt super inspirativní.

GET metadata/buckets/in.c-ex-salesforce-main/user
[
	{
		"value": "My Workspace"
	}	
]

GET metadata/tables/in.c-ex-salesforce-main.opportunity/user
[
	{
		"value": "Some weird stuff is going on here"
	},
	{
		"key": "Proprietary Something",
		"datatype": "string",
		"value": "Long text about something"
	}	
]

GET metadata/columns/in.c-ex-salesforce-main.opportunity.value/user
[
	{
		"value": "Doublecheck"
	}
]

GET metadata/files/49893879782934/user
[
	{
		"value": "My Workspace"
	}
]	

SCHEMA

viz http://schema.org/Offer

GET metadata/tables/in.c-ex-salesforce-main.opportunity/schema
[
	{
		"key": "entity",
		"datatype": "string",
		"value": "Offer"
	}	
]

GET metadata/columns/in.c-ex-salesforce-main.opportunity.value/schema
[
	{
		"key": "property",
		"datatype": "string",
		"value": "price"
	},
	{
		"key": "type",
		"datatype": "string",
		"value": "Number"
	}
]

Hromadné čtení

GET metadata
GET metadata/buckets
GET metadata/tables
GET metadata/columns
GET metadata/files
  • načtení všech celý bucket (tabulky, sloupce) nebo tabulku (sloupce)

Zápis

POST metadata/columns/in.c-ex-salesforce-main.opportunity.value/schema
{
	"key": "property",
	"datatype": "string",
	"value": "price"
}	

Vyhledávání

Můžeme se ptát na přesnou hodnotu tagu, pokud je jakýkoliv datový typ, nebo na range, pokud je to number nebo date.

Například budu moct najít všechny sloupce s částkami, které stáhl ex-generic ze Salesforcu.

GET metadata/search
{
	"result": "columns",
	"query": 
	[
		{
			"node": "table",
			"type": "core",
			"key": "originator"
			"value": "ex-generic"
		},
		{
			"node": "table",
			"type": "core",
			"key": "source"
			"value": "salesforce"
		},					
		{
			"node": "column",
			"type": "schema",
			"key": "property"
			"value": "price"
		},					
		
	]
}

Nebo budeme moct najít všechny tabulky, které mají víc jak milion řádků a importovaly se během posledního týdne.

GET metadata/search
{
	"result": "tables",
	"query": 
	[
		{
			"node": "table",
			"type": "core",
			"key": "rows"
			"range": {
				"gt": 1000000
			}

		},
		{
			"node": "table",
			"type": "core",
			"key": "last-imported"
			"range": {
				"gt": "-7 days"
			}
		}					
	]
}
@Halama

Halama commented Apr 13, 2015

Copy link
Copy Markdown

Nemohly by ty metadata být součásní současné SAPI struktury?
např.:

GET buckets/in.c-ex-salesforce-main
{
    "uri": "https:\/\/connection.keboola.com\/\/v2\/storage\/buckets\/in.c-main",
    "id": "in.c-main",
    "name": "c-main",
    "stage": "in",
    "description": "Main user storage",
    "tables": "https:\/\/connection.keboola.com\/\/v2\/storage\/buckets\/in.c-main\/tables",
    "created": "2012-10-10T09:08:18+0200",
    "lastChangeDate": "2013-09-01T09:01:07+0200",
    "isReadOnly": false,
    "dataSizeBytes": 3538944,
    "rowsCount": 10477,
    "isMaintenance": false,
    "backend": "mysql",
    "attributes": [
        {
            "name": "some",
            "value": "value",
            "protected": false
        }
    ],
    "metadata": {
        "components": {
            "ex-salesforce": [
                {
                    "key": "last-imported",
                    "value": "2015-03-10 10:05:57"
                }
            ],
            "luckyguess": [
                {
                    "key": "datatype",
                    "value": "decimal"
                },
                {
                    "key": "average",
                    "value": 1533.5
                },
                {
                    "key": "median",
                    "value": 1000
                },
                {
                    "key": "distinct-values",
                    "value": 534
                },
                {
                    "key": "histogram-file-id",
                    "value": 159868726
                }
            ]
        },
        "core": [
            {
                "key": "size",
                "value": "23439834"
            },
            {
                "key": "rows",
                "value": "498332"
            },
            {
                "key": "name",
                "value": "Opportunity"
            },
            {
                "key": "description",
                "value": "Table Description"
            }
        ],
        "user": [
            {
                "key": "Proprietary Something",
                "value": "Long text about something"
            }
        ]
    }
}
Imho by se s tím takhle líp pracovalo, všechny data by typicky aplikace získala jedním API callem.
Pro to vyhledávání bych pak klidně udělal nový resource `metadata`

Jak je to s datovýma typama těch key value párů? Vidím že někde máš jenom stringy a někde to vrací i int. Moc si ale neumím představit jak by se ty mixované typy ukládali a jak by se s nima pracovalo. Na druhou stranku ukládat např. čísla jako stringy mi přijde divný a např. v javascriptu se s tím pracuje dost debilně.
Jediný co mě napadá je něco jako:

 "luckyguess": {
                "values": [
                    {
                        "key": "datatype",
                        "value": "decimal"
                    }
                ],
                "metrics": [
                    {
                        "key": "average",
                        "value": 1533.5
                    },
                    {
                        "key": "median",
                        "value": 1000
                    },
                    {
                        "key": "distinct-values",
                        "value": 534
                    },
                    {
                        "key": "histogram-file-id",
                        "value": 159868726
                    }
                ]

což je asi hnus.

@ondrejhlavacek

Copy link
Copy Markdown
Author

určitě by to mohlo bejt součástí sapi struktury, záměrně jsem to ale vyjmul pryč, ať to není ovlivněný současným stavem sapi - např. chceme metadata pro sloupce.

čísla a stringy - jasně, může bejt vše jako string. na druhou stranu - pro vyhledávání může bejt výhodnější, když bude vědět, jestli to je číslo nebo string, ne?

doplním ještě query pro vyhledávání toho, co jsem popsal v dokumentaci

@Halama

Halama commented Aug 4, 2015

Copy link
Copy Markdown

včera jsme se o tom ještě bavili a mít to samostatně (nový resource) dává smysl. Bude se to moct udělat čistě, JSON místo form-data apod. A vlastně to může nahradit současné tables, buckets a možná další resource. Vlastně takové SAPI 3.0 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment